diff --git a/.editorconfig b/.editorconfig index d41df6c789..3fb11b7577 100644 --- a/.editorconfig +++ b/.editorconfig @@ -28,8 +28,7 @@ indent_size = 4 indent_style = space trim_trailing_whitespace = false - -[{*.yaml,*.yml}] +[{*.yaml,*.yml, otelcol.tmpl}] indent_size = 2 indent_style = space trim_trailing_whitespace = true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c904fa009..4a96c94e8d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -299,7 +299,7 @@ jobs: benchmark-data-dir-path: "" # Set auto-push to false since GitHub API token is not given auto-push: false - alert-threshold: '125%' + alert-threshold: '175%' gh-pages-branch: "benchmark-results" fail-on-alert: true diff --git a/Makefile b/Makefile index 7e25e16abc..dd0c84e651 100644 --- a/Makefile +++ b/Makefile @@ -101,7 +101,7 @@ include Makefile.tools include Makefile.containers include Makefile.packaging -.PHONY: help clean no-local-changes build lint format unit-test integration-test run dev run-mock-management-server generate generate-mocks local-apk-package local-deb-package local-rpm-package +.PHONY: help clean no-local-changes build lint format unit-test integration-test run dev run-mock-management-grpc-server generate generate-mocks local-apk-package local-deb-package local-rpm-package help: ## Show help message @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\033[36m\033[0m\n"} /^[$$()% 0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-24s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) @@ -130,7 +130,7 @@ format: ## Format code unit-test: $(TEST_BUILD_DIR) ## Run unit tests @CGO_ENABLED=0 $(GOTEST) -count=1 -coverprofile=$(TEST_BUILD_DIR)/tmp_coverage.out -coverpkg=./... -covermode count ./internal/... ./api/... ./cmd/... ./pkg/... - @cat $(TEST_BUILD_DIR)/tmp_coverage.out | grep -v ".pb.go" | grep -v ".gen.go" | grep -v ".pb.validate.go" | grep -v "fake_" | grep -v "github.com/nginx/agent/v3/test/" > $(TEST_BUILD_DIR)/coverage.out + @cat $(TEST_BUILD_DIR)/tmp_coverage.out | grep -v ".pb.go" | grep -v ".gen.go" | grep -v ".pb.validate.go" | grep -v "fake_" | grep -v "_utils.go" | grep -v "github.com/nginx/agent/v3/test/" > $(TEST_BUILD_DIR)/coverage.out @rm $(TEST_BUILD_DIR)/tmp_coverage.out @$(GOTOOL) cover -html=$(TEST_BUILD_DIR)/coverage.out -o $(TEST_BUILD_DIR)/coverage.html @printf "\nTotal code coverage: " && $(GOTOOL) cover -func=$(TEST_BUILD_DIR)/coverage.out | grep 'total:' | awk '{print $$3}' diff --git a/README.md b/README.md index 8c1be21ed3..b331d103f3 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ The following packages need to be installed: ``` git clone https://github.com/open-telemetry/opentelemetry-collector.git cd opentelemetry-collector -git checkout v0.108.1 +git checkout v0.114.0 cd cmd/mdatagen go install ``` diff --git a/api/grpc/mpi/v1/command.pb.go b/api/grpc/mpi/v1/command.pb.go index e390eb5ac1..ada6092b90 100644 --- a/api/grpc/mpi/v1/command.pb.go +++ b/api/grpc/mpi/v1/command.pb.go @@ -1651,8 +1651,8 @@ type NGINXRuntimeInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // the stub status API URL - StubStatus string `protobuf:"bytes,1,opt,name=stub_status,json=stubStatus,proto3" json:"stub_status,omitempty"` + // the stub status API details + StubStatus *APIDetails `protobuf:"bytes,1,opt,name=stub_status,json=stubStatus,proto3" json:"stub_status,omitempty"` // a list of access_logs AccessLogs []string `protobuf:"bytes,2,rep,name=access_logs,json=accessLogs,proto3" json:"access_logs,omitempty"` // a list of error_logs @@ -1693,11 +1693,11 @@ func (*NGINXRuntimeInfo) Descriptor() ([]byte, []int) { return file_mpi_v1_command_proto_rawDescGZIP(), []int{24} } -func (x *NGINXRuntimeInfo) GetStubStatus() string { +func (x *NGINXRuntimeInfo) GetStubStatus() *APIDetails { if x != nil { return x.StubStatus } - return "" + return nil } func (x *NGINXRuntimeInfo) GetAccessLogs() []string { @@ -1734,8 +1734,8 @@ type NGINXPlusRuntimeInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // the stub status API URL - StubStatus string `protobuf:"bytes,1,opt,name=stub_status,json=stubStatus,proto3" json:"stub_status,omitempty"` + // the stub status API details + StubStatus *APIDetails `protobuf:"bytes,1,opt,name=stub_status,json=stubStatus,proto3" json:"stub_status,omitempty"` // a list of access_logs AccessLogs []string `protobuf:"bytes,2,rep,name=access_logs,json=accessLogs,proto3" json:"access_logs,omitempty"` // a list of error_logs @@ -1744,8 +1744,8 @@ type NGINXPlusRuntimeInfo struct { LoadableModules []string `protobuf:"bytes,4,rep,name=loadable_modules,json=loadableModules,proto3" json:"loadable_modules,omitempty"` // List of NGINX dynamic modules. DynamicModules []string `protobuf:"bytes,5,rep,name=dynamic_modules,json=dynamicModules,proto3" json:"dynamic_modules,omitempty"` - // the plus API location - PlusApi string `protobuf:"bytes,6,opt,name=plus_api,json=plusApi,proto3" json:"plus_api,omitempty"` + // the plus API details + PlusApi *APIDetails `protobuf:"bytes,6,opt,name=plus_api,json=plusApi,proto3" json:"plus_api,omitempty"` } func (x *NGINXPlusRuntimeInfo) Reset() { @@ -1778,11 +1778,11 @@ func (*NGINXPlusRuntimeInfo) Descriptor() ([]byte, []int) { return file_mpi_v1_command_proto_rawDescGZIP(), []int{25} } -func (x *NGINXPlusRuntimeInfo) GetStubStatus() string { +func (x *NGINXPlusRuntimeInfo) GetStubStatus() *APIDetails { if x != nil { return x.StubStatus } - return "" + return nil } func (x *NGINXPlusRuntimeInfo) GetAccessLogs() []string { @@ -1813,10 +1813,65 @@ func (x *NGINXPlusRuntimeInfo) GetDynamicModules() []string { return nil } -func (x *NGINXPlusRuntimeInfo) GetPlusApi() string { +func (x *NGINXPlusRuntimeInfo) GetPlusApi() *APIDetails { if x != nil { return x.PlusApi } + return nil +} + +type APIDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // the API location directive + Location string `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"` + // the API listen directive + Listen string `protobuf:"bytes,2,opt,name=listen,proto3" json:"listen,omitempty"` +} + +func (x *APIDetails) Reset() { + *x = APIDetails{} + mi := &file_mpi_v1_command_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *APIDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*APIDetails) ProtoMessage() {} + +func (x *APIDetails) ProtoReflect() protoreflect.Message { + mi := &file_mpi_v1_command_proto_msgTypes[26] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use APIDetails.ProtoReflect.Descriptor instead. +func (*APIDetails) Descriptor() ([]byte, []int) { + return file_mpi_v1_command_proto_rawDescGZIP(), []int{26} +} + +func (x *APIDetails) GetLocation() string { + if x != nil { + return x.Location + } + return "" +} + +func (x *APIDetails) GetListen() string { + if x != nil { + return x.Listen + } return "" } @@ -1829,7 +1884,7 @@ type InstanceAction struct { func (x *InstanceAction) Reset() { *x = InstanceAction{} - mi := &file_mpi_v1_command_proto_msgTypes[26] + mi := &file_mpi_v1_command_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1841,7 +1896,7 @@ func (x *InstanceAction) String() string { func (*InstanceAction) ProtoMessage() {} func (x *InstanceAction) ProtoReflect() protoreflect.Message { - mi := &file_mpi_v1_command_proto_msgTypes[26] + mi := &file_mpi_v1_command_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1854,7 +1909,7 @@ func (x *InstanceAction) ProtoReflect() protoreflect.Message { // Deprecated: Use InstanceAction.ProtoReflect.Descriptor instead. func (*InstanceAction) Descriptor() ([]byte, []int) { - return file_mpi_v1_command_proto_rawDescGZIP(), []int{26} + return file_mpi_v1_command_proto_rawDescGZIP(), []int{27} } // This contains a series of NGINX Agent configurations @@ -1879,7 +1934,7 @@ type AgentConfig struct { func (x *AgentConfig) Reset() { *x = AgentConfig{} - mi := &file_mpi_v1_command_proto_msgTypes[27] + mi := &file_mpi_v1_command_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1891,7 +1946,7 @@ func (x *AgentConfig) String() string { func (*AgentConfig) ProtoMessage() {} func (x *AgentConfig) ProtoReflect() protoreflect.Message { - mi := &file_mpi_v1_command_proto_msgTypes[27] + mi := &file_mpi_v1_command_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1904,7 +1959,7 @@ func (x *AgentConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentConfig.ProtoReflect.Descriptor instead. func (*AgentConfig) Descriptor() ([]byte, []int) { - return file_mpi_v1_command_proto_rawDescGZIP(), []int{27} + return file_mpi_v1_command_proto_rawDescGZIP(), []int{28} } func (x *AgentConfig) GetCommand() *CommandServer { @@ -1949,16 +2004,23 @@ func (x *AgentConfig) GetMessageBufferSize() string { return "" } -// The command settings, associated with messaging from an external source +// The command server settings, associated with messaging from an external source type CommandServer struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + // Server configuration (e.g., host, port, type) + Server *ServerSettings `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` + // Authentication configuration (e.g., token) + Auth *AuthSettings `protobuf:"bytes,2,opt,name=auth,proto3" json:"auth,omitempty"` + // TLS configuration for secure communication + Tls *TLSSettings `protobuf:"bytes,3,opt,name=tls,proto3" json:"tls,omitempty"` } func (x *CommandServer) Reset() { *x = CommandServer{} - mi := &file_mpi_v1_command_proto_msgTypes[28] + mi := &file_mpi_v1_command_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1970,7 +2032,7 @@ func (x *CommandServer) String() string { func (*CommandServer) ProtoMessage() {} func (x *CommandServer) ProtoReflect() protoreflect.Message { - mi := &file_mpi_v1_command_proto_msgTypes[28] + mi := &file_mpi_v1_command_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1983,7 +2045,28 @@ func (x *CommandServer) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandServer.ProtoReflect.Descriptor instead. func (*CommandServer) Descriptor() ([]byte, []int) { - return file_mpi_v1_command_proto_rawDescGZIP(), []int{28} + return file_mpi_v1_command_proto_rawDescGZIP(), []int{29} +} + +func (x *CommandServer) GetServer() *ServerSettings { + if x != nil { + return x.Server + } + return nil +} + +func (x *CommandServer) GetAuth() *AuthSettings { + if x != nil { + return x.Auth + } + return nil +} + +func (x *CommandServer) GetTls() *TLSSettings { + if x != nil { + return x.Tls + } + return nil } // The metrics settings associated with origins (sources) of the metrics and destinations (exporter) @@ -1995,7 +2078,7 @@ type MetricsServer struct { func (x *MetricsServer) Reset() { *x = MetricsServer{} - mi := &file_mpi_v1_command_proto_msgTypes[29] + mi := &file_mpi_v1_command_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2007,7 +2090,7 @@ func (x *MetricsServer) String() string { func (*MetricsServer) ProtoMessage() {} func (x *MetricsServer) ProtoReflect() protoreflect.Message { - mi := &file_mpi_v1_command_proto_msgTypes[29] + mi := &file_mpi_v1_command_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2020,7 +2103,7 @@ func (x *MetricsServer) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricsServer.ProtoReflect.Descriptor instead. func (*MetricsServer) Descriptor() ([]byte, []int) { - return file_mpi_v1_command_proto_rawDescGZIP(), []int{29} + return file_mpi_v1_command_proto_rawDescGZIP(), []int{30} } // The file settings associated with file server for configurations @@ -2032,7 +2115,7 @@ type FileServer struct { func (x *FileServer) Reset() { *x = FileServer{} - mi := &file_mpi_v1_command_proto_msgTypes[30] + mi := &file_mpi_v1_command_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2044,7 +2127,7 @@ func (x *FileServer) String() string { func (*FileServer) ProtoMessage() {} func (x *FileServer) ProtoReflect() protoreflect.Message { - mi := &file_mpi_v1_command_proto_msgTypes[30] + mi := &file_mpi_v1_command_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2057,7 +2140,7 @@ func (x *FileServer) ProtoReflect() protoreflect.Message { // Deprecated: Use FileServer.ProtoReflect.Descriptor instead. func (*FileServer) Descriptor() ([]byte, []int) { - return file_mpi_v1_command_proto_rawDescGZIP(), []int{30} + return file_mpi_v1_command_proto_rawDescGZIP(), []int{31} } var File_mpi_v1_command_proto protoreflect.FileDescriptor @@ -2297,33 +2380,10 @@ var file_mpi_v1_command_proto_rawDesc = []byte{ 0x6c, 0x73, 0x22, 0x2e, 0x0a, 0x0d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x49, 0x64, 0x22, 0xa2, 0x02, 0x0a, 0x10, 0x4e, 0x47, 0x49, 0x4e, 0x58, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x7a, 0x0a, 0x0b, 0x73, 0x74, 0x75, 0x62, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x59, 0xba, 0x48, - 0x56, 0xba, 0x01, 0x53, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x75, 0x72, 0x69, - 0x12, 0x29, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x55, 0x52, 0x49, 0x20, 0x6f, 0x72, 0x20, 0x63, - 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x69, 0x73, 0x55, 0x72, 0x69, 0x28, 0x29, 0x52, 0x0a, 0x73, 0x74, 0x75, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, - 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6c, 0x6f, - 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4c, - 0x6f, 0x67, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x6f, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6c, - 0x6f, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x27, - 0x0a, 0x0f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x9c, 0x03, 0x0a, 0x14, 0x4e, 0x47, 0x49, 0x4e, - 0x58, 0x50, 0x6c, 0x75, 0x73, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x7a, 0x0a, 0x0b, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x59, 0xba, 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x0a, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x75, 0x72, 0x69, 0x12, 0x29, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x20, 0x55, 0x52, 0x49, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, - 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x55, 0x72, 0x69, 0x28, 0x29, + 0x49, 0x64, 0x22, 0xdb, 0x01, 0x0a, 0x10, 0x4e, 0x47, 0x49, 0x4e, 0x58, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x33, 0x0a, 0x0b, 0x73, 0x74, 0x75, 0x62, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x50, 0x49, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0a, 0x73, 0x74, 0x75, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1d, 0x0a, @@ -2334,61 +2394,83 @@ var file_mpi_v1_command_proto_rawDesc = []byte{ 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, - 0x12, 0x74, 0x0a, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x5f, 0x61, 0x70, 0x69, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x59, 0xba, 0x48, 0x56, 0xba, 0x01, 0x53, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x75, 0x72, 0x69, 0x12, 0x29, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, - 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x55, 0x52, - 0x49, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x55, 0x72, 0x69, 0x28, 0x29, 0x52, 0x07, 0x70, - 0x6c, 0x75, 0x73, 0x41, 0x70, 0x69, 0x22, 0x10, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x02, 0x0a, 0x0b, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x66, 0x69, - 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x04, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, - 0x2e, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, - 0x0f, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x22, 0x0f, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x22, 0x0c, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x32, - 0x87, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x57, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x22, 0x8e, 0x02, 0x0a, 0x14, 0x4e, 0x47, 0x49, 0x4e, 0x58, 0x50, 0x6c, 0x75, 0x73, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x33, 0x0a, 0x0b, 0x73, 0x74, 0x75, + 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x50, 0x49, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x52, 0x0a, 0x73, 0x74, 0x75, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, + 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x12, + 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x29, + 0x0a, 0x10, 0x6c, 0x6f, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x61, 0x64, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x70, 0x6c, 0x75, 0x73, 0x5f, 0x61, 0x70, 0x69, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x50, + 0x49, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x73, 0x41, 0x70, + 0x69, 0x22, 0x40, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x22, 0x10, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x02, 0x0a, 0x0b, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, + 0x69, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, + 0x2f, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x90, 0x01, 0x0a, + 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2e, + 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x28, + 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x4c, 0x53, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x22, + 0x0f, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x22, 0x0c, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x32, 0x87, + 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x57, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x15, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6c, - 0x61, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x24, 0x2e, 0x6d, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x19, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x1a, 0x1e, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x08, 0x5a, 0x06, 0x6d, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x75, 0x73, 0x12, 0x24, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6c, 0x61, + 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x66, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x24, 0x2e, 0x6d, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, + 0x6c, 0x61, 0x6e, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x19, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x1a, 0x1e, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x08, 0x5a, 0x06, 0x6d, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2404,7 +2486,7 @@ func file_mpi_v1_command_proto_rawDescGZIP() []byte { } var file_mpi_v1_command_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_mpi_v1_command_proto_msgTypes = make([]protoimpl.MessageInfo, 31) +var file_mpi_v1_command_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_mpi_v1_command_proto_goTypes = []any{ (InstanceHealth_InstanceHealthStatus)(0), // 0: mpi.v1.InstanceHealth.InstanceHealthStatus (InstanceMeta_InstanceType)(0), // 1: mpi.v1.InstanceMeta.InstanceType @@ -2434,67 +2516,77 @@ var file_mpi_v1_command_proto_goTypes = []any{ (*InstanceChild)(nil), // 25: mpi.v1.InstanceChild (*NGINXRuntimeInfo)(nil), // 26: mpi.v1.NGINXRuntimeInfo (*NGINXPlusRuntimeInfo)(nil), // 27: mpi.v1.NGINXPlusRuntimeInfo - (*InstanceAction)(nil), // 28: mpi.v1.InstanceAction - (*AgentConfig)(nil), // 29: mpi.v1.AgentConfig - (*CommandServer)(nil), // 30: mpi.v1.CommandServer - (*MetricsServer)(nil), // 31: mpi.v1.MetricsServer - (*FileServer)(nil), // 32: mpi.v1.FileServer - (*MessageMeta)(nil), // 33: mpi.v1.MessageMeta - (*CommandResponse)(nil), // 34: mpi.v1.CommandResponse - (*FileOverview)(nil), // 35: mpi.v1.FileOverview - (*structpb.Struct)(nil), // 36: google.protobuf.Struct + (*APIDetails)(nil), // 28: mpi.v1.APIDetails + (*InstanceAction)(nil), // 29: mpi.v1.InstanceAction + (*AgentConfig)(nil), // 30: mpi.v1.AgentConfig + (*CommandServer)(nil), // 31: mpi.v1.CommandServer + (*MetricsServer)(nil), // 32: mpi.v1.MetricsServer + (*FileServer)(nil), // 33: mpi.v1.FileServer + (*MessageMeta)(nil), // 34: mpi.v1.MessageMeta + (*CommandResponse)(nil), // 35: mpi.v1.CommandResponse + (*FileOverview)(nil), // 36: mpi.v1.FileOverview + (*structpb.Struct)(nil), // 37: google.protobuf.Struct + (*ServerSettings)(nil), // 38: mpi.v1.ServerSettings + (*AuthSettings)(nil), // 39: mpi.v1.AuthSettings + (*TLSSettings)(nil), // 40: mpi.v1.TLSSettings } var file_mpi_v1_command_proto_depIdxs = []int32{ - 33, // 0: mpi.v1.CreateConnectionRequest.message_meta:type_name -> mpi.v1.MessageMeta + 34, // 0: mpi.v1.CreateConnectionRequest.message_meta:type_name -> mpi.v1.MessageMeta 3, // 1: mpi.v1.CreateConnectionRequest.resource:type_name -> mpi.v1.Resource 21, // 2: mpi.v1.Resource.instances:type_name -> mpi.v1.Instance 4, // 3: mpi.v1.Resource.host_info:type_name -> mpi.v1.HostInfo 6, // 4: mpi.v1.Resource.container_info:type_name -> mpi.v1.ContainerInfo 5, // 5: mpi.v1.HostInfo.release_info:type_name -> mpi.v1.ReleaseInfo - 34, // 6: mpi.v1.CreateConnectionResponse.response:type_name -> mpi.v1.CommandResponse - 29, // 7: mpi.v1.CreateConnectionResponse.agent_config:type_name -> mpi.v1.AgentConfig - 33, // 8: mpi.v1.UpdateDataPlaneStatusRequest.message_meta:type_name -> mpi.v1.MessageMeta + 35, // 6: mpi.v1.CreateConnectionResponse.response:type_name -> mpi.v1.CommandResponse + 30, // 7: mpi.v1.CreateConnectionResponse.agent_config:type_name -> mpi.v1.AgentConfig + 34, // 8: mpi.v1.UpdateDataPlaneStatusRequest.message_meta:type_name -> mpi.v1.MessageMeta 3, // 9: mpi.v1.UpdateDataPlaneStatusRequest.resource:type_name -> mpi.v1.Resource 0, // 10: mpi.v1.InstanceHealth.instance_health_status:type_name -> mpi.v1.InstanceHealth.InstanceHealthStatus - 33, // 11: mpi.v1.UpdateDataPlaneHealthRequest.message_meta:type_name -> mpi.v1.MessageMeta + 34, // 11: mpi.v1.UpdateDataPlaneHealthRequest.message_meta:type_name -> mpi.v1.MessageMeta 10, // 12: mpi.v1.UpdateDataPlaneHealthRequest.instance_healths:type_name -> mpi.v1.InstanceHealth - 33, // 13: mpi.v1.DataPlaneResponse.message_meta:type_name -> mpi.v1.MessageMeta - 34, // 14: mpi.v1.DataPlaneResponse.command_response:type_name -> mpi.v1.CommandResponse - 33, // 15: mpi.v1.ManagementPlaneRequest.message_meta:type_name -> mpi.v1.MessageMeta + 34, // 13: mpi.v1.DataPlaneResponse.message_meta:type_name -> mpi.v1.MessageMeta + 35, // 14: mpi.v1.DataPlaneResponse.command_response:type_name -> mpi.v1.CommandResponse + 34, // 15: mpi.v1.ManagementPlaneRequest.message_meta:type_name -> mpi.v1.MessageMeta 15, // 16: mpi.v1.ManagementPlaneRequest.status_request:type_name -> mpi.v1.StatusRequest 16, // 17: mpi.v1.ManagementPlaneRequest.health_request:type_name -> mpi.v1.HealthRequest 17, // 18: mpi.v1.ManagementPlaneRequest.config_apply_request:type_name -> mpi.v1.ConfigApplyRequest 18, // 19: mpi.v1.ManagementPlaneRequest.config_upload_request:type_name -> mpi.v1.ConfigUploadRequest 19, // 20: mpi.v1.ManagementPlaneRequest.action_request:type_name -> mpi.v1.APIActionRequest 20, // 21: mpi.v1.ManagementPlaneRequest.command_status_request:type_name -> mpi.v1.CommandStatusRequest - 35, // 22: mpi.v1.ConfigApplyRequest.overview:type_name -> mpi.v1.FileOverview - 35, // 23: mpi.v1.ConfigUploadRequest.overview:type_name -> mpi.v1.FileOverview + 36, // 22: mpi.v1.ConfigApplyRequest.overview:type_name -> mpi.v1.FileOverview + 36, // 23: mpi.v1.ConfigUploadRequest.overview:type_name -> mpi.v1.FileOverview 22, // 24: mpi.v1.Instance.instance_meta:type_name -> mpi.v1.InstanceMeta 23, // 25: mpi.v1.Instance.instance_config:type_name -> mpi.v1.InstanceConfig 24, // 26: mpi.v1.Instance.instance_runtime:type_name -> mpi.v1.InstanceRuntime 1, // 27: mpi.v1.InstanceMeta.instance_type:type_name -> mpi.v1.InstanceMeta.InstanceType - 28, // 28: mpi.v1.InstanceConfig.actions:type_name -> mpi.v1.InstanceAction - 29, // 29: mpi.v1.InstanceConfig.agent_config:type_name -> mpi.v1.AgentConfig + 29, // 28: mpi.v1.InstanceConfig.actions:type_name -> mpi.v1.InstanceAction + 30, // 29: mpi.v1.InstanceConfig.agent_config:type_name -> mpi.v1.AgentConfig 26, // 30: mpi.v1.InstanceRuntime.nginx_runtime_info:type_name -> mpi.v1.NGINXRuntimeInfo 27, // 31: mpi.v1.InstanceRuntime.nginx_plus_runtime_info:type_name -> mpi.v1.NGINXPlusRuntimeInfo 25, // 32: mpi.v1.InstanceRuntime.instance_children:type_name -> mpi.v1.InstanceChild - 30, // 33: mpi.v1.AgentConfig.command:type_name -> mpi.v1.CommandServer - 31, // 34: mpi.v1.AgentConfig.metrics:type_name -> mpi.v1.MetricsServer - 32, // 35: mpi.v1.AgentConfig.file:type_name -> mpi.v1.FileServer - 36, // 36: mpi.v1.AgentConfig.labels:type_name -> google.protobuf.Struct - 2, // 37: mpi.v1.CommandService.CreateConnection:input_type -> mpi.v1.CreateConnectionRequest - 8, // 38: mpi.v1.CommandService.UpdateDataPlaneStatus:input_type -> mpi.v1.UpdateDataPlaneStatusRequest - 11, // 39: mpi.v1.CommandService.UpdateDataPlaneHealth:input_type -> mpi.v1.UpdateDataPlaneHealthRequest - 13, // 40: mpi.v1.CommandService.Subscribe:input_type -> mpi.v1.DataPlaneResponse - 7, // 41: mpi.v1.CommandService.CreateConnection:output_type -> mpi.v1.CreateConnectionResponse - 9, // 42: mpi.v1.CommandService.UpdateDataPlaneStatus:output_type -> mpi.v1.UpdateDataPlaneStatusResponse - 12, // 43: mpi.v1.CommandService.UpdateDataPlaneHealth:output_type -> mpi.v1.UpdateDataPlaneHealthResponse - 14, // 44: mpi.v1.CommandService.Subscribe:output_type -> mpi.v1.ManagementPlaneRequest - 41, // [41:45] is the sub-list for method output_type - 37, // [37:41] is the sub-list for method input_type - 37, // [37:37] is the sub-list for extension type_name - 37, // [37:37] is the sub-list for extension extendee - 0, // [0:37] is the sub-list for field type_name + 28, // 33: mpi.v1.NGINXRuntimeInfo.stub_status:type_name -> mpi.v1.APIDetails + 28, // 34: mpi.v1.NGINXPlusRuntimeInfo.stub_status:type_name -> mpi.v1.APIDetails + 28, // 35: mpi.v1.NGINXPlusRuntimeInfo.plus_api:type_name -> mpi.v1.APIDetails + 31, // 36: mpi.v1.AgentConfig.command:type_name -> mpi.v1.CommandServer + 32, // 37: mpi.v1.AgentConfig.metrics:type_name -> mpi.v1.MetricsServer + 33, // 38: mpi.v1.AgentConfig.file:type_name -> mpi.v1.FileServer + 37, // 39: mpi.v1.AgentConfig.labels:type_name -> google.protobuf.Struct + 38, // 40: mpi.v1.CommandServer.server:type_name -> mpi.v1.ServerSettings + 39, // 41: mpi.v1.CommandServer.auth:type_name -> mpi.v1.AuthSettings + 40, // 42: mpi.v1.CommandServer.tls:type_name -> mpi.v1.TLSSettings + 2, // 43: mpi.v1.CommandService.CreateConnection:input_type -> mpi.v1.CreateConnectionRequest + 8, // 44: mpi.v1.CommandService.UpdateDataPlaneStatus:input_type -> mpi.v1.UpdateDataPlaneStatusRequest + 11, // 45: mpi.v1.CommandService.UpdateDataPlaneHealth:input_type -> mpi.v1.UpdateDataPlaneHealthRequest + 13, // 46: mpi.v1.CommandService.Subscribe:input_type -> mpi.v1.DataPlaneResponse + 7, // 47: mpi.v1.CommandService.CreateConnection:output_type -> mpi.v1.CreateConnectionResponse + 9, // 48: mpi.v1.CommandService.UpdateDataPlaneStatus:output_type -> mpi.v1.UpdateDataPlaneStatusResponse + 12, // 49: mpi.v1.CommandService.UpdateDataPlaneHealth:output_type -> mpi.v1.UpdateDataPlaneHealthResponse + 14, // 50: mpi.v1.CommandService.Subscribe:output_type -> mpi.v1.ManagementPlaneRequest + 47, // [47:51] is the sub-list for method output_type + 43, // [43:47] is the sub-list for method input_type + 43, // [43:43] is the sub-list for extension type_name + 43, // [43:43] is the sub-list for extension extendee + 0, // [0:43] is the sub-list for field type_name } func init() { file_mpi_v1_command_proto_init() } @@ -2529,7 +2621,7 @@ func file_mpi_v1_command_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mpi_v1_command_proto_rawDesc, NumEnums: 2, - NumMessages: 31, + NumMessages: 32, NumExtensions: 0, NumServices: 1, }, diff --git a/api/grpc/mpi/v1/command.pb.validate.go b/api/grpc/mpi/v1/command.pb.validate.go index cc3233ba29..051f5904c7 100644 --- a/api/grpc/mpi/v1/command.pb.validate.go +++ b/api/grpc/mpi/v1/command.pb.validate.go @@ -3591,7 +3591,34 @@ func (m *NGINXRuntimeInfo) validate(all bool) error { var errors []error - // no validation rules for StubStatus + if all { + switch v := interface{}(m.GetStubStatus()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, NGINXRuntimeInfoValidationError{ + field: "StubStatus", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, NGINXRuntimeInfoValidationError{ + field: "StubStatus", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetStubStatus()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return NGINXRuntimeInfoValidationError{ + field: "StubStatus", + reason: "embedded message failed validation", + cause: err, + } + } + } if len(errors) > 0 { return NGINXRuntimeInfoMultiError(errors) @@ -3693,9 +3720,63 @@ func (m *NGINXPlusRuntimeInfo) validate(all bool) error { var errors []error - // no validation rules for StubStatus + if all { + switch v := interface{}(m.GetStubStatus()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, NGINXPlusRuntimeInfoValidationError{ + field: "StubStatus", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, NGINXPlusRuntimeInfoValidationError{ + field: "StubStatus", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetStubStatus()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return NGINXPlusRuntimeInfoValidationError{ + field: "StubStatus", + reason: "embedded message failed validation", + cause: err, + } + } + } - // no validation rules for PlusApi + if all { + switch v := interface{}(m.GetPlusApi()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, NGINXPlusRuntimeInfoValidationError{ + field: "PlusApi", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, NGINXPlusRuntimeInfoValidationError{ + field: "PlusApi", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetPlusApi()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return NGINXPlusRuntimeInfoValidationError{ + field: "PlusApi", + reason: "embedded message failed validation", + cause: err, + } + } + } if len(errors) > 0 { return NGINXPlusRuntimeInfoMultiError(errors) @@ -3777,6 +3858,109 @@ var _ interface { ErrorName() string } = NGINXPlusRuntimeInfoValidationError{} +// Validate checks the field values on APIDetails with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *APIDetails) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on APIDetails with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in APIDetailsMultiError, or +// nil if none found. +func (m *APIDetails) ValidateAll() error { + return m.validate(true) +} + +func (m *APIDetails) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Location + + // no validation rules for Listen + + if len(errors) > 0 { + return APIDetailsMultiError(errors) + } + + return nil +} + +// APIDetailsMultiError is an error wrapping multiple validation errors +// returned by APIDetails.ValidateAll() if the designated constraints aren't met. +type APIDetailsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m APIDetailsMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m APIDetailsMultiError) AllErrors() []error { return m } + +// APIDetailsValidationError is the validation error returned by +// APIDetails.Validate if the designated constraints aren't met. +type APIDetailsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e APIDetailsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e APIDetailsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e APIDetailsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e APIDetailsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e APIDetailsValidationError) ErrorName() string { return "APIDetailsValidationError" } + +// Error satisfies the builtin error interface +func (e APIDetailsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sAPIDetails.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = APIDetailsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = APIDetailsValidationError{} + // Validate checks the field values on InstanceAction with the rules defined in // the proto definition for this message. If any rules are violated, the first // error encountered is returned, or nil if there are no violations. @@ -4121,6 +4305,93 @@ func (m *CommandServer) validate(all bool) error { var errors []error + if all { + switch v := interface{}(m.GetServer()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CommandServerValidationError{ + field: "Server", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CommandServerValidationError{ + field: "Server", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetServer()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CommandServerValidationError{ + field: "Server", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetAuth()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CommandServerValidationError{ + field: "Auth", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CommandServerValidationError{ + field: "Auth", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetAuth()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CommandServerValidationError{ + field: "Auth", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetTls()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CommandServerValidationError{ + field: "Tls", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CommandServerValidationError{ + field: "Tls", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTls()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CommandServerValidationError{ + field: "Tls", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return CommandServerMultiError(errors) } diff --git a/api/grpc/mpi/v1/command.proto b/api/grpc/mpi/v1/command.proto index f7879ea28c..c179baaa87 100644 --- a/api/grpc/mpi/v1/command.proto +++ b/api/grpc/mpi/v1/command.proto @@ -264,12 +264,8 @@ message InstanceChild { // A set of runtime NGINX OSS settings message NGINXRuntimeInfo { - // the stub status API URL - string stub_status = 1 [(buf.validate.field).cel = { - id: "string.uri", - message: "value must be a valid URI or can be empty", - expression: "this == \'\' || this.isUri()" - }]; + // the stub status API details + APIDetails stub_status = 1; // a list of access_logs repeated string access_logs = 2; // a list of error_logs @@ -282,12 +278,8 @@ message NGINXRuntimeInfo { // A set of runtime NGINX Plus settings message NGINXPlusRuntimeInfo { - // the stub status API URL - string stub_status = 1 [(buf.validate.field).cel = { - id: "string.uri", - message: "value must be a valid URI or can be empty", - expression: "this == \'\' || this.isUri()" - }]; + // the stub status API details + APIDetails stub_status = 1; // a list of access_logs repeated string access_logs = 2; // a list of error_logs @@ -296,12 +288,15 @@ message NGINXPlusRuntimeInfo { repeated string loadable_modules = 4; // List of NGINX dynamic modules. repeated string dynamic_modules = 5; - // the plus API location - string plus_api = 6 [(buf.validate.field).cel = { - id: "string.uri", - message: "value must be a valid URI or can be empty", - expression: "this == \'\' || this.isUri()" - }]; + // the plus API details + APIDetails plus_api = 6; +} + +message APIDetails { + // the API location directive + string location = 1; + // the API listen directive + string listen = 2; } // A set of actions that can be performed on an instance @@ -323,8 +318,15 @@ message AgentConfig { string message_buffer_size = 6; } -// The command settings, associated with messaging from an external source -message CommandServer {} +// The command server settings, associated with messaging from an external source +message CommandServer { + // Server configuration (e.g., host, port, type) + mpi.v1.ServerSettings server = 1; + // Authentication configuration (e.g., token) + mpi.v1.AuthSettings auth = 2; + // TLS configuration for secure communication + mpi.v1.TLSSettings tls = 3; +} // The metrics settings associated with origins (sources) of the metrics and destinations (exporter) message MetricsServer {} diff --git a/api/grpc/mpi/v1/common.pb.go b/api/grpc/mpi/v1/common.pb.go index 8f28d16ed7..008b7b98ff 100644 --- a/api/grpc/mpi/v1/common.pb.go +++ b/api/grpc/mpi/v1/common.pb.go @@ -88,6 +88,58 @@ func (CommandResponse_CommandStatus) EnumDescriptor() ([]byte, []int) { return file_mpi_v1_common_proto_rawDescGZIP(), []int{1, 0} } +type ServerSettings_ServerType int32 + +const ( + // Undefined server type + ServerSettings_SERVER_SETTINGS_TYPE_UNDEFINED ServerSettings_ServerType = 0 + // gRPC server type + ServerSettings_SERVER_SETTINGS_TYPE_GRPC ServerSettings_ServerType = 1 + // HTTP server type + ServerSettings_SERVER_SETTINGS_TYPE_HTTP ServerSettings_ServerType = 2 +) + +// Enum value maps for ServerSettings_ServerType. +var ( + ServerSettings_ServerType_name = map[int32]string{ + 0: "SERVER_SETTINGS_TYPE_UNDEFINED", + 1: "SERVER_SETTINGS_TYPE_GRPC", + 2: "SERVER_SETTINGS_TYPE_HTTP", + } + ServerSettings_ServerType_value = map[string]int32{ + "SERVER_SETTINGS_TYPE_UNDEFINED": 0, + "SERVER_SETTINGS_TYPE_GRPC": 1, + "SERVER_SETTINGS_TYPE_HTTP": 2, + } +) + +func (x ServerSettings_ServerType) Enum() *ServerSettings_ServerType { + p := new(ServerSettings_ServerType) + *p = x + return p +} + +func (x ServerSettings_ServerType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ServerSettings_ServerType) Descriptor() protoreflect.EnumDescriptor { + return file_mpi_v1_common_proto_enumTypes[1].Descriptor() +} + +func (ServerSettings_ServerType) Type() protoreflect.EnumType { + return &file_mpi_v1_common_proto_enumTypes[1] +} + +func (x ServerSettings_ServerType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ServerSettings_ServerType.Descriptor instead. +func (ServerSettings_ServerType) EnumDescriptor() ([]byte, []int) { + return file_mpi_v1_common_proto_rawDescGZIP(), []int{2, 0} +} + // Meta-information associated with a message type MessageMeta struct { state protoimpl.MessageState @@ -218,6 +270,191 @@ func (x *CommandResponse) GetError() string { return "" } +// The top-level configuration for the command server +type ServerSettings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Command server host + Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` + // Command server port + Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` + // Server type (enum for gRPC, HTTP, etc.) + Type ServerSettings_ServerType `protobuf:"varint,3,opt,name=type,proto3,enum=mpi.v1.ServerSettings_ServerType" json:"type,omitempty"` +} + +func (x *ServerSettings) Reset() { + *x = ServerSettings{} + mi := &file_mpi_v1_common_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ServerSettings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServerSettings) ProtoMessage() {} + +func (x *ServerSettings) ProtoReflect() protoreflect.Message { + mi := &file_mpi_v1_common_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServerSettings.ProtoReflect.Descriptor instead. +func (*ServerSettings) Descriptor() ([]byte, []int) { + return file_mpi_v1_common_proto_rawDescGZIP(), []int{2} +} + +func (x *ServerSettings) GetHost() string { + if x != nil { + return x.Host + } + return "" +} + +func (x *ServerSettings) GetPort() int32 { + if x != nil { + return x.Port + } + return 0 +} + +func (x *ServerSettings) GetType() ServerSettings_ServerType { + if x != nil { + return x.Type + } + return ServerSettings_SERVER_SETTINGS_TYPE_UNDEFINED +} + +// Defines the authentication configuration +type AuthSettings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *AuthSettings) Reset() { + *x = AuthSettings{} + mi := &file_mpi_v1_common_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AuthSettings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthSettings) ProtoMessage() {} + +func (x *AuthSettings) ProtoReflect() protoreflect.Message { + mi := &file_mpi_v1_common_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthSettings.ProtoReflect.Descriptor instead. +func (*AuthSettings) Descriptor() ([]byte, []int) { + return file_mpi_v1_common_proto_rawDescGZIP(), []int{3} +} + +type TLSSettings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // TLS certificate for the command server (e.g., "/path/to/cert.pem") + Cert string `protobuf:"bytes,1,opt,name=cert,proto3" json:"cert,omitempty"` + // TLS key for the command server (e.g., "/path/to/key.pem") + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + // CA certificate for the command server (e.g., "/path/to/ca.pem") + Ca string `protobuf:"bytes,3,opt,name=ca,proto3" json:"ca,omitempty"` + // Controls whether a client verifies the server's certificate chain and host name. + // If skip_verify is true, accepts any certificate presented by the server and any host name in that certificate. + SkipVerify bool `protobuf:"varint,4,opt,name=skip_verify,json=skipVerify,proto3" json:"skip_verify,omitempty"` + // Server name for TLS + ServerName string `protobuf:"bytes,5,opt,name=server_name,json=serverName,proto3" json:"server_name,omitempty"` +} + +func (x *TLSSettings) Reset() { + *x = TLSSettings{} + mi := &file_mpi_v1_common_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TLSSettings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TLSSettings) ProtoMessage() {} + +func (x *TLSSettings) ProtoReflect() protoreflect.Message { + mi := &file_mpi_v1_common_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TLSSettings.ProtoReflect.Descriptor instead. +func (*TLSSettings) Descriptor() ([]byte, []int) { + return file_mpi_v1_common_proto_rawDescGZIP(), []int{4} +} + +func (x *TLSSettings) GetCert() string { + if x != nil { + return x.Cert + } + return "" +} + +func (x *TLSSettings) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *TLSSettings) GetCa() string { + if x != nil { + return x.Ca + } + return "" +} + +func (x *TLSSettings) GetSkipVerify() bool { + if x != nil { + return x.SkipVerify + } + return false +} + +func (x *TLSSettings) GetServerName() string { + if x != nil { + return x.ServerName + } + return "" +} + var File_mpi_v1_common_proto protoreflect.FileDescriptor var file_mpi_v1_common_proto_rawDesc = []byte{ @@ -253,8 +490,33 @@ var file_mpi_v1_common_proto_rawDesc = []byte{ 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x04, 0x42, 0x08, 0x5a, - 0x06, 0x6d, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x04, 0x22, 0xec, 0x01, + 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x68, 0x6f, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x42, 0x0b, 0xba, 0x48, 0x08, 0x1a, 0x06, 0x18, 0xff, 0xff, 0x03, 0x28, 0x01, 0x52, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6e, 0x0a, 0x0a, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x45, + 0x52, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, + 0x0a, 0x19, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, + 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x50, 0x43, 0x10, 0x01, 0x12, 0x1d, 0x0a, + 0x19, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x10, 0x02, 0x22, 0x0e, 0x0a, 0x0c, + 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x85, 0x01, 0x0a, + 0x0b, 0x54, 0x4c, 0x53, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x65, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x72, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x63, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x63, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x5a, 0x06, 0x6d, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -269,22 +531,27 @@ func file_mpi_v1_common_proto_rawDescGZIP() []byte { return file_mpi_v1_common_proto_rawDescData } -var file_mpi_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_mpi_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_mpi_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_mpi_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_mpi_v1_common_proto_goTypes = []any{ (CommandResponse_CommandStatus)(0), // 0: mpi.v1.CommandResponse.CommandStatus - (*MessageMeta)(nil), // 1: mpi.v1.MessageMeta - (*CommandResponse)(nil), // 2: mpi.v1.CommandResponse - (*timestamppb.Timestamp)(nil), // 3: google.protobuf.Timestamp + (ServerSettings_ServerType)(0), // 1: mpi.v1.ServerSettings.ServerType + (*MessageMeta)(nil), // 2: mpi.v1.MessageMeta + (*CommandResponse)(nil), // 3: mpi.v1.CommandResponse + (*ServerSettings)(nil), // 4: mpi.v1.ServerSettings + (*AuthSettings)(nil), // 5: mpi.v1.AuthSettings + (*TLSSettings)(nil), // 6: mpi.v1.TLSSettings + (*timestamppb.Timestamp)(nil), // 7: google.protobuf.Timestamp } var file_mpi_v1_common_proto_depIdxs = []int32{ - 3, // 0: mpi.v1.MessageMeta.timestamp:type_name -> google.protobuf.Timestamp + 7, // 0: mpi.v1.MessageMeta.timestamp:type_name -> google.protobuf.Timestamp 0, // 1: mpi.v1.CommandResponse.status:type_name -> mpi.v1.CommandResponse.CommandStatus - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 1, // 2: mpi.v1.ServerSettings.type:type_name -> mpi.v1.ServerSettings.ServerType + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_mpi_v1_common_proto_init() } @@ -297,8 +564,8 @@ func file_mpi_v1_common_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mpi_v1_common_proto_rawDesc, - NumEnums: 1, - NumMessages: 2, + NumEnums: 2, + NumMessages: 5, NumExtensions: 0, NumServices: 0, }, diff --git a/api/grpc/mpi/v1/common.pb.validate.go b/api/grpc/mpi/v1/common.pb.validate.go index f057af507f..e462feaee8 100644 --- a/api/grpc/mpi/v1/common.pb.validate.go +++ b/api/grpc/mpi/v1/common.pb.validate.go @@ -272,3 +272,317 @@ var _ interface { Cause() error ErrorName() string } = CommandResponseValidationError{} + +// Validate checks the field values on ServerSettings with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *ServerSettings) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ServerSettings with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in ServerSettingsMultiError, +// or nil if none found. +func (m *ServerSettings) ValidateAll() error { + return m.validate(true) +} + +func (m *ServerSettings) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Host + + // no validation rules for Port + + // no validation rules for Type + + if len(errors) > 0 { + return ServerSettingsMultiError(errors) + } + + return nil +} + +// ServerSettingsMultiError is an error wrapping multiple validation errors +// returned by ServerSettings.ValidateAll() if the designated constraints +// aren't met. +type ServerSettingsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ServerSettingsMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ServerSettingsMultiError) AllErrors() []error { return m } + +// ServerSettingsValidationError is the validation error returned by +// ServerSettings.Validate if the designated constraints aren't met. +type ServerSettingsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ServerSettingsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ServerSettingsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ServerSettingsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ServerSettingsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ServerSettingsValidationError) ErrorName() string { return "ServerSettingsValidationError" } + +// Error satisfies the builtin error interface +func (e ServerSettingsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sServerSettings.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ServerSettingsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ServerSettingsValidationError{} + +// Validate checks the field values on AuthSettings with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *AuthSettings) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on AuthSettings with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in AuthSettingsMultiError, or +// nil if none found. +func (m *AuthSettings) ValidateAll() error { + return m.validate(true) +} + +func (m *AuthSettings) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return AuthSettingsMultiError(errors) + } + + return nil +} + +// AuthSettingsMultiError is an error wrapping multiple validation errors +// returned by AuthSettings.ValidateAll() if the designated constraints aren't met. +type AuthSettingsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m AuthSettingsMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m AuthSettingsMultiError) AllErrors() []error { return m } + +// AuthSettingsValidationError is the validation error returned by +// AuthSettings.Validate if the designated constraints aren't met. +type AuthSettingsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e AuthSettingsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e AuthSettingsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e AuthSettingsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e AuthSettingsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e AuthSettingsValidationError) ErrorName() string { return "AuthSettingsValidationError" } + +// Error satisfies the builtin error interface +func (e AuthSettingsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sAuthSettings.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = AuthSettingsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = AuthSettingsValidationError{} + +// Validate checks the field values on TLSSettings with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *TLSSettings) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TLSSettings with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in TLSSettingsMultiError, or +// nil if none found. +func (m *TLSSettings) ValidateAll() error { + return m.validate(true) +} + +func (m *TLSSettings) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Cert + + // no validation rules for Key + + // no validation rules for Ca + + // no validation rules for SkipVerify + + // no validation rules for ServerName + + if len(errors) > 0 { + return TLSSettingsMultiError(errors) + } + + return nil +} + +// TLSSettingsMultiError is an error wrapping multiple validation errors +// returned by TLSSettings.ValidateAll() if the designated constraints aren't met. +type TLSSettingsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TLSSettingsMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TLSSettingsMultiError) AllErrors() []error { return m } + +// TLSSettingsValidationError is the validation error returned by +// TLSSettings.Validate if the designated constraints aren't met. +type TLSSettingsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TLSSettingsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TLSSettingsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TLSSettingsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TLSSettingsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TLSSettingsValidationError) ErrorName() string { return "TLSSettingsValidationError" } + +// Error satisfies the builtin error interface +func (e TLSSettingsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTLSSettings.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TLSSettingsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TLSSettingsValidationError{} diff --git a/api/grpc/mpi/v1/common.proto b/api/grpc/mpi/v1/common.proto index e02e74f3c6..d35406b16b 100644 --- a/api/grpc/mpi/v1/common.proto +++ b/api/grpc/mpi/v1/common.proto @@ -43,3 +43,39 @@ message CommandResponse { // Provides an error message of why the command failed, only populated when CommandStatus is COMMAND_STATUS_ERROR string error = 3; } + +// The top-level configuration for the command server +message ServerSettings { + // Command server host + string host = 1; + // Command server port + int32 port = 2 [(buf.validate.field).int32 = {gte: 1, lte: 65535}]; + // Server type (enum for gRPC, HTTP, etc.) + ServerType type = 3; + enum ServerType { + // Undefined server type + SERVER_SETTINGS_TYPE_UNDEFINED = 0; + // gRPC server type + SERVER_SETTINGS_TYPE_GRPC = 1; + // HTTP server type + SERVER_SETTINGS_TYPE_HTTP = 2; + } +} + +// Defines the authentication configuration +message AuthSettings { +} + +message TLSSettings { + // TLS certificate for the command server (e.g., "/path/to/cert.pem") + string cert = 1; + // TLS key for the command server (e.g., "/path/to/key.pem") + string key = 2; + // CA certificate for the command server (e.g., "/path/to/ca.pem") + string ca = 3; + // Controls whether a client verifies the server's certificate chain and host name. + // If skip_verify is true, accepts any certificate presented by the server and any host name in that certificate. + bool skip_verify = 4; + // Server name for TLS + string server_name = 5; +} diff --git a/api/grpc/mpi/v1/files.pb.go b/api/grpc/mpi/v1/files.pb.go index 9c9acf3fa1..da66963960 100644 --- a/api/grpc/mpi/v1/files.pb.go +++ b/api/grpc/mpi/v1/files.pb.go @@ -1183,7 +1183,6 @@ type X509Name struct { // Postal Code (PC): Postal or ZIP code for the address. PostalCode []string `protobuf:"bytes,7,rep,name=postal_code,json=postalCode,proto3" json:"postal_code,omitempty"` // Serial Number (SN): Unique identifier or serial number. - // Must be non-empty. SerialNumber string `protobuf:"bytes,8,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"` // Common Name (CN): Typically the person’s or entity's full name. CommonName string `protobuf:"bytes,9,opt,name=common_name,json=commonName,proto3" json:"common_name,omitempty"` @@ -1472,7 +1471,7 @@ var file_mpi_v1_files_proto_rawDesc = []byte{ 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfb, 0x02, 0x0a, 0x0f, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x42, 0x09, 0xba, 0x48, 0x06, 0x7a, 0x04, 0x10, 0x01, 0x18, 0x15, 0x52, 0x0c, + 0x01, 0x28, 0x0c, 0x42, 0x09, 0xba, 0x48, 0x06, 0x7a, 0x04, 0x10, 0x00, 0x18, 0x15, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x58, 0x35, 0x30, 0x39, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x06, @@ -1504,7 +1503,7 @@ var file_mpi_v1_files_proto_rawDesc = []byte{ 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x64, 0x6e, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x22, 0xaa, 0x04, 0x0a, 0x08, 0x58, 0x35, 0x30, 0x39, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x73, 0x22, 0xac, 0x04, 0x0a, 0x08, 0x58, 0x35, 0x30, 0x39, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x0e, 0xba, 0x48, 0x0b, 0x92, 0x01, 0x08, 0x22, 0x06, 0x72, 0x04, 0x10, 0x02, 0x18, 0x02, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x30, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, @@ -1526,70 +1525,70 @@ var file_mpi_v1_files_proto_rawDesc = []byte{ 0x73, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0x0c, 0xba, 0x48, 0x09, 0x92, 0x01, 0x06, 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, - 0x65, 0x12, 0x2c, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x41, - 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3e, - 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x53, - 0x0a, 0x15, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x41, - 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x2a, 0x8a, 0x03, 0x0a, 0x12, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x49, - 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x41, 0x4c, 0x47, 0x4f, 0x52, 0x49, 0x54, 0x48, - 0x4d, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x4d, - 0x44, 0x32, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x10, 0x01, 0x12, 0x10, 0x0a, - 0x0c, 0x4d, 0x44, 0x35, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x10, 0x02, 0x12, - 0x11, 0x0a, 0x0d, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, - 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x57, 0x49, 0x54, - 0x48, 0x5f, 0x52, 0x53, 0x41, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x48, 0x41, 0x33, 0x38, - 0x34, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, - 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x10, - 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x53, 0x41, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, 0x48, - 0x41, 0x31, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x53, 0x41, 0x5f, 0x57, 0x49, 0x54, 0x48, - 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x08, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x43, 0x44, - 0x53, 0x41, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x09, 0x12, 0x15, + 0x65, 0x12, 0x2e, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xba, 0x48, 0x06, 0x72, 0x04, 0x10, + 0x00, 0x18, 0x15, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x28, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6e, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x22, 0x53, 0x0a, 0x15, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x8a, 0x03, 0x0a, 0x12, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x1f, 0x0a, 0x1b, + 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x41, 0x4c, 0x47, 0x4f, 0x52, 0x49, + 0x54, 0x48, 0x4d, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, + 0x0c, 0x4d, 0x44, 0x32, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x10, 0x01, 0x12, + 0x10, 0x0a, 0x0c, 0x4d, 0x44, 0x35, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x10, + 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, + 0x53, 0x41, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x57, + 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x48, 0x41, + 0x33, 0x38, 0x34, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x10, 0x05, 0x12, 0x13, + 0x0a, 0x0f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, + 0x41, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x53, 0x41, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, + 0x53, 0x48, 0x41, 0x31, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x53, 0x41, 0x5f, 0x57, 0x49, + 0x54, 0x48, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x08, 0x12, 0x13, 0x0a, 0x0f, 0x45, + 0x43, 0x44, 0x53, 0x41, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x09, + 0x12, 0x15, 0x0a, 0x11, 0x45, 0x43, 0x44, 0x53, 0x41, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, + 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x0a, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x43, 0x44, 0x53, 0x41, + 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x43, 0x44, 0x53, 0x41, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, 0x48, 0x41, - 0x32, 0x35, 0x36, 0x10, 0x0a, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x43, 0x44, 0x53, 0x41, 0x5f, 0x57, - 0x49, 0x54, 0x48, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11, - 0x45, 0x43, 0x44, 0x53, 0x41, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, - 0x32, 0x10, 0x0c, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x57, 0x49, - 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x5f, 0x50, 0x53, 0x53, 0x10, 0x0d, 0x12, 0x17, 0x0a, 0x13, - 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x5f, - 0x50, 0x53, 0x53, 0x10, 0x0e, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, - 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x5f, 0x50, 0x53, 0x53, 0x10, 0x0f, 0x12, 0x10, - 0x0a, 0x0c, 0x50, 0x55, 0x52, 0x45, 0x5f, 0x45, 0x44, 0x32, 0x35, 0x35, 0x31, 0x39, 0x10, 0x10, - 0x32, 0xaf, 0x02, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x48, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x12, - 0x1a, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, - 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6d, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x12, 0x1d, 0x2e, 0x6d, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x76, 0x65, 0x72, - 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x76, - 0x69, 0x65, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, - 0x07, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0a, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x6d, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x08, 0x5a, 0x06, 0x6d, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x35, 0x31, 0x32, 0x10, 0x0c, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, + 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x5f, 0x50, 0x53, 0x53, 0x10, 0x0d, 0x12, 0x17, + 0x0a, 0x13, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, + 0x41, 0x5f, 0x50, 0x53, 0x53, 0x10, 0x0e, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x48, 0x41, 0x35, 0x31, + 0x32, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x52, 0x53, 0x41, 0x5f, 0x50, 0x53, 0x53, 0x10, 0x0f, + 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x55, 0x52, 0x45, 0x5f, 0x45, 0x44, 0x32, 0x35, 0x35, 0x31, 0x39, + 0x10, 0x10, 0x32, 0xaf, 0x02, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, + 0x77, 0x12, 0x1a, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x76, + 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, + 0x65, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x12, 0x1d, + 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x76, + 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x76, 0x65, + 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x6d, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x6d, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x08, 0x5a, 0x06, 0x6d, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/grpc/mpi/v1/files.proto b/api/grpc/mpi/v1/files.proto index 9007177ccd..e8168e1bda 100644 --- a/api/grpc/mpi/v1/files.proto +++ b/api/grpc/mpi/v1/files.proto @@ -152,7 +152,7 @@ message UpdateFileResponse { // and https://github.com/googleapis/googleapis/blob/005df4681b89bd204a90b76168a6dc9d9e7bf4fe/google/cloud/iot/v1/resources.proto#L341 message CertificateMeta { // Serial number of the certificate, usually a unique identifier, RFC5280 states the upper limit for serial number is 20 octets - bytes serial_number = 1 [(buf.validate.field).bytes.min_len = 1, (buf.validate.field).bytes.max_len = 21]; + bytes serial_number = 1 [(buf.validate.field).bytes.min_len = 0, (buf.validate.field).bytes.max_len = 21]; // Issuer details (who issued the certificate) X509Name issuer = 2; @@ -270,8 +270,7 @@ message X509Name { repeated string postal_code = 7 [(buf.validate.field).repeated.items.string.min_len = 1]; // Serial Number (SN): Unique identifier or serial number. - // Must be non-empty. - string serial_number = 8 [(buf.validate.field).string.min_len = 1]; + string serial_number = 8 [(buf.validate.field).string.min_len = 0, (buf.validate.field).string.max_len = 21]; // Common Name (CN): Typically the person’s or entity's full name. string common_name = 9 [(buf.validate.field).string.min_len = 1]; diff --git a/docs/proto/protos.md b/docs/proto/protos.md index 6383858dd6..408c233853 100644 --- a/docs/proto/protos.md +++ b/docs/proto/protos.md @@ -4,10 +4,14 @@ ## Table of Contents - [mpi/v1/common.proto](#mpi_v1_common-proto) + - [AuthSettings](#mpi-v1-AuthSettings) - [CommandResponse](#mpi-v1-CommandResponse) - [MessageMeta](#mpi-v1-MessageMeta) + - [ServerSettings](#mpi-v1-ServerSettings) + - [TLSSettings](#mpi-v1-TLSSettings) - [CommandResponse.CommandStatus](#mpi-v1-CommandResponse-CommandStatus) + - [ServerSettings.ServerType](#mpi-v1-ServerSettings-ServerType) - [mpi/v1/files.proto](#mpi_v1_files-proto) - [AttributeTypeAndValue](#mpi-v1-AttributeTypeAndValue) @@ -36,6 +40,7 @@ - [mpi/v1/command.proto](#mpi_v1_command-proto) - [APIActionRequest](#mpi-v1-APIActionRequest) + - [APIDetails](#mpi-v1-APIDetails) - [AgentConfig](#mpi-v1-AgentConfig) - [CommandServer](#mpi-v1-CommandServer) - [CommandStatusRequest](#mpi-v1-CommandStatusRequest) @@ -86,6 +91,16 @@ This source code is licensed under the Apache License, Version 2.0 license found LICENSE file in the root directory of this source tree. + + +### AuthSettings +Defines the authentication configuration + + + + + + ### CommandResponse @@ -119,6 +134,42 @@ Meta-information associated with a message + + + +### ServerSettings +The top-level configuration for the command server + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| host | [string](#string) | | Command server host | +| port | [int32](#int32) | | Command server port | +| type | [ServerSettings.ServerType](#mpi-v1-ServerSettings-ServerType) | | Server type (enum for gRPC, HTTP, etc.) | + + + + + + + + +### TLSSettings + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| cert | [string](#string) | | TLS certificate for the command server (e.g., "/path/to/cert.pem") | +| key | [string](#string) | | TLS key for the command server (e.g., "/path/to/key.pem") | +| ca | [string](#string) | | CA certificate for the command server (e.g., "/path/to/ca.pem") | +| skip_verify | [bool](#bool) | | Controls whether a client verifies the server's certificate chain and host name. If skip_verify is true, accepts any certificate presented by the server and any host name in that certificate. | +| server_name | [string](#string) | | Server name for TLS | + + + + + @@ -136,6 +187,19 @@ Command status enum | COMMAND_STATUS_FAILURE | 4 | Command failure | + + + +### ServerSettings.ServerType + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| SERVER_SETTINGS_TYPE_UNDEFINED | 0 | Undefined server type | +| SERVER_SETTINGS_TYPE_GRPC | 1 | gRPC server type | +| SERVER_SETTINGS_TYPE_HTTP | 2 | HTTP server type | + + @@ -444,7 +508,7 @@ Represents the dates for which a certificate is valid as seen at https://pkg.go. | province | [string](#string) | repeated | State or Province name (ST): Name of the state or province. | | street_address | [string](#string) | repeated | Street Address (STREET): Physical street address. | | postal_code | [string](#string) | repeated | Postal Code (PC): Postal or ZIP code for the address. | -| serial_number | [string](#string) | | Serial Number (SN): Unique identifier or serial number. Must be non-empty. | +| serial_number | [string](#string) | | Serial Number (SN): Unique identifier or serial number. | | common_name | [string](#string) | | Common Name (CN): Typically the person’s or entity's full name. | | names | [AttributeTypeAndValue](#mpi-v1-AttributeTypeAndValue) | repeated | Parsed attributes including any non-standard attributes, as specified in RFC 2253. These attributes are parsed but not marshaled by this package. | | extra_names | [AttributeTypeAndValue](#mpi-v1-AttributeTypeAndValue) | repeated | Additional attributes to be included in the marshaled distinguished names. These override any attributes with the same OID in `names`. | @@ -541,6 +605,22 @@ Perform an associated API action on an instance + + +### APIDetails + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| location | [string](#string) | | the API location directive | +| listen | [string](#string) | | the API listen directive | + + + + + + ### AgentConfig @@ -564,7 +644,14 @@ This contains a series of NGINX Agent configurations ### CommandServer -The command settings, associated with messaging from an external source +The command server settings, associated with messaging from an external source + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| server | [ServerSettings](#mpi-v1-ServerSettings) | | Server configuration (e.g., host, port, type) | +| auth | [AuthSettings](#mpi-v1-AuthSettings) | | Authentication configuration (e.g., token) | +| tls | [TLSSettings](#mpi-v1-TLSSettings) | | TLS configuration for secure communication | @@ -864,12 +951,12 @@ A set of runtime NGINX Plus settings | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| stub_status | [string](#string) | | the stub status API URL | +| stub_status | [APIDetails](#mpi-v1-APIDetails) | | the stub status API details | | access_logs | [string](#string) | repeated | a list of access_logs | | error_logs | [string](#string) | repeated | a list of error_logs | | loadable_modules | [string](#string) | repeated | List of NGINX potentially loadable modules (installed but not loaded). | | dynamic_modules | [string](#string) | repeated | List of NGINX dynamic modules. | -| plus_api | [string](#string) | | the plus API location | +| plus_api | [APIDetails](#mpi-v1-APIDetails) | | the plus API details | @@ -884,7 +971,7 @@ A set of runtime NGINX OSS settings | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| stub_status | [string](#string) | | the stub status API URL | +| stub_status | [APIDetails](#mpi-v1-APIDetails) | | the stub status API details | | access_logs | [string](#string) | repeated | a list of access_logs | | error_logs | [string](#string) | repeated | a list of error_logs | | loadable_modules | [string](#string) | repeated | List of NGINX potentially loadable modules (installed but not loaded). | diff --git a/go.mod b/go.mod index b6ed31ecf3..8481ed0fe2 100644 --- a/go.mod +++ b/go.mod @@ -8,9 +8,9 @@ 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 v27.1.1+incompatible - github.com/fsnotify/fsnotify v1.7.0 - github.com/go-resty/resty/v2 v2.13.1 + github.com/docker/docker v27.3.1+incompatible + github.com/fsnotify/fsnotify v1.8.0 + github.com/go-resty/resty/v2 v2.16.2 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 @@ -19,119 +19,106 @@ require ( github.com/nginxinc/nginx-plus-go-client/v2 v2.0.1 github.com/nginxinc/nginx-prometheus-exporter v1.3.0 github.com/nxadm/tail v1.4.11 - 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/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.114.0 + github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.114.0 + github.com/shirou/gopsutil/v4 v4.24.10 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.9.0 - github.com/testcontainers/testcontainers-go v0.33.0 + github.com/stretchr/testify v1.10.0 + github.com/testcontainers/testcontainers-go v0.34.0 github.com/trivago/grok v1.0.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/extension/auth v0.108.1 - go.opentelemetry.io/collector/filter 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.opentelemetry.io/collector/component v0.114.0 + go.opentelemetry.io/collector/component/componenttest v0.114.0 + go.opentelemetry.io/collector/config/confighttp v0.114.0 + go.opentelemetry.io/collector/config/configtelemetry v0.114.0 + go.opentelemetry.io/collector/confmap v1.20.0 + go.opentelemetry.io/collector/confmap/provider/envprovider v1.20.0 + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.20.0 + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.20.0 + go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.17.0 + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.20.0 + go.opentelemetry.io/collector/connector v0.114.0 + go.opentelemetry.io/collector/consumer v0.114.0 + go.opentelemetry.io/collector/consumer/consumertest v0.114.0 + go.opentelemetry.io/collector/exporter v0.114.0 + go.opentelemetry.io/collector/exporter/debugexporter v0.114.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.114.0 + go.opentelemetry.io/collector/exporter/otlphttpexporter v0.114.0 + go.opentelemetry.io/collector/extension v0.114.0 + go.opentelemetry.io/collector/extension/auth v0.114.0 + go.opentelemetry.io/collector/extension/experimental/storage v0.114.0 + go.opentelemetry.io/collector/filter v0.114.0 + go.opentelemetry.io/collector/otelcol v0.114.0 + go.opentelemetry.io/collector/pdata v1.20.0 + go.opentelemetry.io/collector/processor v0.114.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.114.0 + go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.114.0 + go.opentelemetry.io/collector/receiver v0.114.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.114.0 + go.opentelemetry.io/collector/receiver/receivertest v0.114.0 + go.opentelemetry.io/otel v1.32.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 + golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e golang.org/x/mod v0.21.0 - golang.org/x/sync v0.8.0 - google.golang.org/protobuf v1.34.2 + golang.org/x/sync v0.9.0 + google.golang.org/protobuf v1.35.2 ) require ( - cloud.google.com/go/compute/metadata v0.5.0 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect dario.cat/mergo v1.0.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/Showmax/go-fqdn v1.0.0 // indirect github.com/alecthomas/participle/v2 v2.1.1 // indirect + github.com/antchfx/xmlquery v1.4.2 // indirect + github.com/antchfx/xpath v1.3.2 // 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.55.5 // indirect + github.com/apache/thrift v0.21.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect - github.com/bytedance/sonic v1.9.1 // indirect + github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect + github.com/bytedance/sonic v1.12.5 // indirect + github.com/bytedance/sonic/loader v0.2.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-20221115062448-fe3a3abad311 // indirect - github.com/containerd/containerd v1.7.18 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/containerd/platforms v0.2.1 // indirect - github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // 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/ebitengine/purego v0.8.1 // indirect github.com/elastic/go-grok v0.3.1 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/elastic/lunes v0.1.0 // indirect github.com/expr-lang/expr v1.16.9 // indirect github.com/fatih/color v1.17.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/gabriel-vasile/mimetype v1.4.7 // indirect github.com/gin-contrib/sse v0.1.0 // 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 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 - github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/swag v0.22.9 // indirect 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.1.0 // indirect + github.com/go-playground/validator/v10 v10.23.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // 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 @@ -140,101 +127,81 @@ require ( github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/cel-go v0.17.1 // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/gorilla/mux v1.8.1 // 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-rootcerts v1.0.2 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect + github.com/hashicorp/consul/api v1.30.0 // 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/serf v0.10.1 // 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/jaegertracing/jaeger v1.60.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jaegertracing/jaeger v1.62.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 github.com/jstemmer/go-junit-report v1.0.0 // indirect - github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect 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/leodido/go-syslog/v4 v4.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/leodido/go-syslog/v4 v4.2.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/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/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // 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 github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect 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/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/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.114.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.114.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/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // 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/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 v0.60.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/rs/cors v1.11.0 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect @@ -254,88 +221,95 @@ require ( 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/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.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/zpagesextension v0.108.1 // indirect - go.opentelemetry.io/collector/featuregate v1.14.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/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/collector v0.114.0 // indirect + go.opentelemetry.io/collector/client v1.20.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.114.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.114.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.20.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.114.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.20.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.20.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.20.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.20.0 // indirect + go.opentelemetry.io/collector/config/internal v0.114.0 // indirect + go.opentelemetry.io/collector/connector/connectorprofiles v0.114.0 // indirect + go.opentelemetry.io/collector/connector/connectortest v0.114.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.114.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror/consumererrorprofiles v0.114.0 // indirect + go.opentelemetry.io/collector/consumer/consumerprofiles v0.114.0 // indirect + go.opentelemetry.io/collector/exporter/exporterhelper/exporterhelperprofiles v0.114.0 // indirect + go.opentelemetry.io/collector/exporter/exporterprofiles v0.114.0 // indirect + go.opentelemetry.io/collector/exporter/exportertest v0.114.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.114.0 // indirect + go.opentelemetry.io/collector/extension/extensiontest v0.114.0 // indirect + go.opentelemetry.io/collector/extension/zpagesextension v0.114.0 // indirect + go.opentelemetry.io/collector/featuregate v1.20.0 // indirect + go.opentelemetry.io/collector/internal/fanoutconsumer v0.114.0 // indirect + go.opentelemetry.io/collector/internal/memorylimiter v0.114.0 // indirect + go.opentelemetry.io/collector/internal/sharedcomponent v0.114.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.114.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.114.0 // indirect + go.opentelemetry.io/collector/pipeline v0.114.0 // indirect + go.opentelemetry.io/collector/pipeline/pipelineprofiles v0.114.0 // indirect + go.opentelemetry.io/collector/processor/processorprofiles v0.114.0 // indirect + go.opentelemetry.io/collector/processor/processortest v0.114.0 // indirect + go.opentelemetry.io/collector/receiver/receiverprofiles v0.114.0 // indirect + go.opentelemetry.io/collector/semconv v0.114.0 // indirect + go.opentelemetry.io/collector/service v0.114.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect + go.opentelemetry.io/contrib/zpages v0.56.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect + go.opentelemetry.io/otel/log v0.8.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/arch v0.7.0 // indirect - golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // 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.24.0 // indirect + golang.org/x/arch v0.12.0 // indirect + golang.org/x/time v0.7.0 // indirect + golang.org/x/tools v0.25.0 // 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 + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 // 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 - 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/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 + k8s.io/api v0.31.2 // indirect + k8s.io/apimachinery v0.31.2 // indirect + k8s.io/client-go v0.31.2 // indirect ) require ( - github.com/gin-gonic/gin v1.9.1 + github.com/gin-gonic/gin v1.10.0 github.com/mattn/go-isatty v0.0.20 // indirect github.com/nginxinc/nginx-go-crossplane v0.4.46 - github.com/prometheus/client_golang v1.20.2 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/samber/slog-gin v1.11.0 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.26.0 // indirect - golang.org/x/net v0.28.0 // indirect - golang.org/x/sys v0.25.0 // indirect - golang.org/x/text v0.18.0 // indirect - google.golang.org/grpc v1.65.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 + golang.org/x/crypto v0.29.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + google.golang.org/grpc v1.68.0 ) diff --git a/go.sum b/go.sum index dd098cbcba..5a643b5455 100644 --- a/go.sum +++ b/go.sum @@ -1,37 +1,15 @@ 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= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -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.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/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/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/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= 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.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= @@ -46,99 +24,69 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= 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= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= 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.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/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/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/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= github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -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-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= 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= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -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.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= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q= +github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= 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.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/bytedance/sonic v1.12.5 h1:hoZxY8uW+mT+OpkcUWw4k0fDINtOcVavEsGfzwzFU/w= +github.com/bytedance/sonic v1.12.5/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.1 h1:1GgorWTqf12TA8mma4DDSbaQigE2wOgQo7iCjjJv3+E= +github.com/bytedance/sonic/loader v0.2.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= 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= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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/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= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -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/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= 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.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= -github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= 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/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= 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= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -151,69 +99,53 @@ github.com/digitalocean/godo v1.118.0 h1:lkzGFQmACrVCp7UqH1sAi4JK/PWwlc5aaxubgor 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/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/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= +github.com/docker/docker v27.3.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/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= 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= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= +github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -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/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= 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= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 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/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= 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/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= +github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -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-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/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= 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= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -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.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -222,18 +154,10 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= @@ -242,16 +166,13 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= 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.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= -github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= +github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= +github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg= +github.com/go-resty/resty/v2 v2.16.2/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= 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/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-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/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= @@ -260,27 +181,18 @@ 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= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -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/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.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= @@ -293,10 +205,6 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 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.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= @@ -306,101 +214,60 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw 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.5.0/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.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= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 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/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-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.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.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.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.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= 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= 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.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/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= +github.com/hashicorp/consul/api v1.30.0 h1:ArHVMMILb1nQv8vZSGIwwQd2gtc+oSQZ6CalyiyH2XQ= +github.com/hashicorp/consul/api v1.30.0/go.mod h1:B2uGchvaXVW2JhFoS8nqTxMD5PBykr4ebY4JWHTTeLM= 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= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -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 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= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= 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.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= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= 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= @@ -408,10 +275,6 @@ github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -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-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= @@ -420,69 +283,56 @@ github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt 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= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= 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.60.0 h1:6fswbNydmXJNH7uz2smy2fFs9KKRpLrFXdW0u/hud4o= -github.com/jaegertracing/jaeger v1.60.0/go.mod h1:CMrmMLIWn7xLP0IwBgpbxtgIuOT6TF/7bpTUBaOUaXo= +github.com/jaegertracing/jaeger v1.62.0 h1:YoaJ2e8oVz5sqGGlVAKSUCED8DzJ1q7PojBmZFNKoJA= +github.com/jaegertracing/jaeger v1.62.0/go.mod h1:jhEIHazwyb+a6xlRBi+p96BAvTYTSmGkghcwdQfV7FM= 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= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -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.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= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 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/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= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= 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/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +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/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= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-syslog/v4 v4.1.0 h1:Wsl194qyWXr7V6DrGWC3xmxA9Ra6XgWO+toNt2fmCaI= -github.com/leodido/go-syslog/v4 v4.1.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= +github.com/leodido/go-syslog/v4 v4.2.0 h1:A7vpbYxsO4e2E8udaurkLlxP5LDpDbmPMsGnuhb7jVk= +github.com/leodido/go-syslog/v4 v4.2.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= 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= @@ -497,40 +347,20 @@ 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= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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/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.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/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= github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -539,231 +369,160 @@ github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3N github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nginxinc/nginx-go-crossplane v0.4.46 h1:QsmhZRHkl2IcPjqjbLB8s55ViH0u5hopSv6DpwgtmOo= github.com/nginxinc/nginx-go-crossplane v0.4.46/go.mod h1:UzbZnyFv0vPlt1Urbnp/mrFCzBL4tYCReFuNBpFQEfI= github.com/nginxinc/nginx-plus-go-client/v2 v2.0.1 h1:5VVK38bnELMDWnwfF6dSv57ResXh9AUzeDa72ENj94o= github.com/nginxinc/nginx-plus-go-client/v2 v2.0.1/go.mod h1:He+1izxYxVVO5/C9ZTukwOpvkAx5eS19nRQgKXDhX5I= 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= -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.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/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/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.114.0 h1:zSYFm8GJumwSgjb8uBaPTv1o+cfe/pF54VcnyWc/ZW4= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector v0.114.0/go.mod h1:fTWNaY51QtkqbgYpfPxGWeY7az/RIAhG7jzGLKZO+A4= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.114.0 h1:oA79wMjQSQBKz+X90LD5edNOyaEsewspJRBYgxliEMA= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.114.0/go.mod h1:uk7Z36vhLtevNy5672jGxgzNJA2LND6wmispTuhHCxI= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.114.0 h1:YkZmPfP8ruNxOtEekdLwLPT8xB+rEtSYtHcRKgAcG8U= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.114.0/go.mod h1:0AYBzVlZwZQFW0TY8E1weKAoaIKpbFrzXR/3Iz3ajls= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.114.0 h1:fTfrAu7BBfbCzNQzfP4FXChIyMiSzVvKNjJt0LYMwjg= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.114.0/go.mod h1:g1nxzzm8MFUTr/5VxdeFpAtDjQkL6hsxzp+DEUSgDfY= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.114.0 h1:nSKttft4flnFlHQ3A9PUmWRLnb5ryJYaepKHh7o9L24= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.114.0/go.mod h1:onECInmk3wKXBl8TPYgdQI4ryv4KD5EziLT8hUetDws= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.114.0 h1:1f1Iftxr0L3KqBQ+eXtndyYEu7ZfHLtCySQKggNg5Is= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.114.0/go.mod h1:mI7yAI+tZnIMYsG4IKXiKkbHOEYi5a/z0kChxQ+Wsck= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.114.0 h1:E6+uPWQOHP0iK5tjwDFFqSZrXIwNnFFVidoGpXYYjS8= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.114.0/go.mod h1:aR8Xvujg+zi00AmrWZYgWtJNegv6C3FTKe81ATRoHpg= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.114.0 h1:G7SHyt5TvFSEsiaxyhZdqkjcRoK2rP5wl4a3Mu31JM4= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.114.0/go.mod h1:TRsDReUh7ALEUutKVoLlGMRc2QECZAyT/5g/cpAr+aw= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.114.0 h1:6g5EvbygaEBqed0rJotGHcfxgxGV8hSN/4ZoZFfac5M= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.114.0/go.mod h1:gU87iMdDAdHrQQCWTURbrlE/dLYgFecJ/+WBHuNMjQI= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.114.0 h1:mchuc816TxLpmsGvFbtGA3KBVx91vAXi7vJnlvsQdiU= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.114.0/go.mod h1:vgCMUWPVrfjNux9P9G053fRqGFF6BS3xtxNFZZdFTCM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.114.0 h1:0LbaoE7Aof8J4CVQ5kYv1QbuL3usTxLRSMFisDNBX9U= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.114.0/go.mod h1:ByoGXMLeHE/k5ELO3EITitVmvq3bh4Z/GVwWZZxrQ5s= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.114.0 h1:d2wCLlENxH4I2axQWaogivx/5ZIjDYgn9MIf6sFxlJ4= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.114.0/go.mod h1:Psyligv8GKL9WI3TraW3BLwkOX4TRxaaa1BBQQyICzA= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.114.0 h1:WrVBqO/ps3KvUyEhtdL/uDDHhKoszLEE1ywDbwskNRg= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.114.0/go.mod h1:JYklzR+ZxQaxjzlfJP3bxX6rQFl/Hbo0vd3yNj/1s1s= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.114.0 h1:lt87gwZaUP9Lh0EAgZFTYego0k89NU8K6Qkk82oR/n8= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.114.0/go.mod h1:nxxBsX9Z2Q7HQvybUTx8CzUvYCJewKBM1Eys6SiS0eg= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.114.0 h1:TrGpqqMJxh5fTzdu5HZORKvDiIUBK8b9K/3zUCGbjps= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.114.0/go.mod h1:mw+aVzR/3HtuGZE5xM6zEXHFv411QG8MxI8mQFJSd5c= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.114.0 h1:lvpwitQL0CDKHyExi+Wi0MPXGBjpgK5YbXljRYE6YTU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetricmetadata v0.114.0/go.mod h1:/peNiVTNFe3osINRwW88WB0v5BC1ifjEmDL5oui+ry0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.114.0 h1:SXi6JSSs2cWROnC1U2v3XysG3t58ilGUwoLqxpGuwFU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.114.0/go.mod h1:LSd6sus2Jvpg3M3vM4HgmVh3/dmMtcJmTqELrFOQFRg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.114.0 h1:G6U2eHR2CGSYb2btot6l05o+mdqsC0ZN7dH8QssXSdk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.114.0/go.mod h1:kZQvVVzpahX8kFUfEBmzFtDhkKAQW6i8XQCMozDRUlk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.114.0 h1:m8uPYU2rTj0sKiYgzCvIPajD3meiYsu+nX0hplUnlEU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.114.0/go.mod h1:P0BaP92pXPkTyTmObfLYUoRBfMYU+i0hdS3oM1DpGJo= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.114.0 h1:Qg80zPfNMlub7LO07VMDElOu3M2oxqdZgvvB+X72a4U= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.114.0/go.mod h1:5qsGcjFV3WFI6J2onAlkR7Xd/8VtwJcECaDRZfW4Tb4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.114.0 h1:PwUMZ6fHMEUV5i9hUly+z3UujDTTdxQtWzL0rWc/lgA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.114.0/go.mod h1:YEHL6w4vvB9b0/lNwGjz8DyWXTF/7Xw0Hkgc3mGWwa8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.114.0 h1:Xr3Hvm9cxOSQX94tLX1yX63uvuvtglJICrOz9YcxiuI= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.114.0/go.mod h1:cgIgmEg66RhVtAv4JkIhHdy70kn2EtVhrH8CtyvhfuI= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.114.0 h1:WymtAsFHYen4GTTTXvVqZCoMz6vPADYUf4xIP0Gvm+E= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.114.0/go.mod h1:FcTNci+LpU5x5FkHM0Su3k6/ESDHWQsL30AFISzaIyk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.114.0 h1:G7TfgGuzi4eS1DwsO+BkGmnGo/QjSZFvFoGyZX9hX+Y= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.114.0/go.mod h1:LdVhwMq8FwKz81d8Cc++jiPvCgMd2jZGebuj44Xzkks= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.114.0 h1:eJxap/u8Q5wYnBcJTrTS1Tq6wq31SOlIr+FMJX5ZoC8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.114.0/go.mod h1:H7uIA2RBaxit2mSwSU8Wc7QXSJX7r8UR66YvdcLmtto= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.114.0 h1:xDbTY8zDUP3RKG1kg1tmULnBkLEDMwmSpf9j2H0sIcc= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.114.0/go.mod h1:t5uoTcckI8kQeW1sZl8A+1UebVJPe47Qi3WQeNZu6w4= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.114.0 h1:fltPkjMuiVTtIVwoWUzbL0ad2CTCJsWfnCSDJQ9hSxU= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.114.0/go.mod h1:HcG364Is9u2EDqOUtQX0RwnbHtQqSh5+x2FdcYC+F1M= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.114.0 h1:I+eGB36xWAv51CLhrcM+3KffHSgFPc9aYPm1Wpemb08= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.114.0/go.mod h1:CIl+EkH7+wBkS/PgTWTRnw6KzTaLhwXrXdu/6Vu/Q88= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.114.0 h1:QBR07Gaw6ePkufQ/AhHgBv4OlwzXlULTdiUnaKIlvLk= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.114.0/go.mod h1:coY0CV/sNj1hltRXKZr2gnrLvr7xUbnW+GhpCQpGR/Y= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.114.0 h1:bvHU4B0kAOdJnf+r1Vd1S5/3gVuFRUahaixxwNLy2/U= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor v0.114.0/go.mod h1:mATisrcvcY/kAWmsGuDMHhOrY6f9a1ZOCBwjrVQQ7YY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.114.0 h1:je7Aiyn5AHAcpCNpTN5Q4l2SIeqJEvtOjoaZhHszGrs= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.114.0/go.mod h1:cVG4aXgfQFSdSfhAgoawDmmKixogjlvqQtmjmqVJgb4= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.114.0 h1:lKG7Ghtba2l9P4FFP7I+SbVRqHEpXCGOZs367YTEwGc= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/transformprocessor v0.114.0/go.mod h1:5U/lrnkK5YtIeTFXI8OzDN/d827WtI6pQvu7/59pUVA= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.114.0 h1:kSxkZPWBA6je7xXkpMWycjyc2BIMvLGD+OGTIRtJ0xw= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.114.0/go.mod h1:rBegsrFk6WSDU4v9TiOvH3h7xintiOhPq9qd+72SlK8= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.114.0 h1:1NeG/cgiqBMWQJxFvWQmWo9BVj3k4uOvEK0o++BFINY= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.114.0/go.mod h1:skPwfv1xYwB5onG9sj31J4OYUxx6p+wc40aogGy+nVE= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.114.0 h1:LlbC49Kg1OdxaN/asBrMwLS3ElcqBqfqIclzD2KPEBw= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.114.0/go.mod h1:2neCtnHmRraWmxZa81Wkp16A8MCan6Og7Y455epn3j0= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.114.0 h1:gdljk66vBTT3lWfSdP4Hl7FaABdH1YPhUCH6jnG2+qY= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.114.0/go.mod h1:T1p6ShTr8farkE4qUB2TyGUIvRSN3s17D0qY7rMqCRM= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.114.0 h1:chiIs7XGNSoptd0VgVR912NFogB8srpuVzgeVM9xW0w= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.114.0/go.mod h1:cHIBJ01AgmkTUN2FgXz9NU8LbnLGUR2uxssCdiqwV4w= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.114.0 h1:E686MeQcQ+a3Q47A/xAc3Nk6Qdz8wHcBLMJ3Y8bNKi0= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.114.0/go.mod h1:zkQAapuNRobj7GY8kKRal+2EYkAMWmZ1KMysUrQI48A= +github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.114.0 h1:/4hKXCQaD78y6cFA4xXMfZhh86/RNwrjyr6xnhFs5AA= +github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.114.0/go.mod h1:aDVz0hgz3NO2EjN8QqJtTJATbXB/JW0Ob69JbuYcf+M= 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= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/openshift/api v0.0.0-20210521075222-e273a339932a/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= -github.com/openshift/api v3.9.0+incompatible h1:fJ/KsefYuZAjmrr3+5U9yZIZbTOpVkDDLDLFresAeYs= -github.com/openshift/api v3.9.0+incompatible/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= -github.com/openshift/build-machinery-go v0.0.0-20210423112049-9415d7ebd33e/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= -github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 h1:ZHRIMCFIJN1p9LsJt4HQ+akDrys4PrYnXzOWI5LK03I= -github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8r9mqDVsPb5td3NehsNOAWa4uiFkYEfVZioQ2gH0= 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.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= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= 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-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= 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.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_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= 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.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= +github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= 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= -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.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= 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= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= @@ -774,17 +533,14 @@ github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnA 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.7 h1:V9UGTK4gQ8HvcnPKf6Zt3XHyQq/peaekfxpJ2HSocJk= -github.com/shirou/gopsutil/v4 v4.24.7/go.mod h1:0uW/073rP7FYLOkvxolUQM5rMOLTNmRXnFKafpb71rw= +github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= +github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= 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.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= @@ -792,14 +548,12 @@ github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 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.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.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= @@ -808,7 +562,6 @@ github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AV 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= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= @@ -816,18 +569,16 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.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.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= -github.com/testcontainers/testcontainers-go v0.33.0/go.mod h1:W80YpTa8D5C3Yy16icheD01UTDu+LmXIA2Keo+jWtT8= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= 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= @@ -836,7 +587,6 @@ github.com/trivago/grok v1.0.0 h1:oV2ljyZT63tgXkmgEHg2U0jMqiKKuL0hkn49s6aRavQ= github.com/trivago/grok v1.0.0/go.mod h1:9t59xLInhrncYq9a3J7488NgiBZi5y5yC7bss+w4NHM= github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM= github.com/trivago/tgo v1.0.7/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc= -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= @@ -856,148 +606,184 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -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.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -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= -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/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/collector v0.114.0 h1:XLLLOHns06P9XjVHyp0OdEMdwXvol5MLzugqQMmXYuU= +go.opentelemetry.io/collector v0.114.0/go.mod h1:XbjD4Yw9LunLo3IJu3ZZytNZ0drEVznxw1Z14Ujlw3s= +go.opentelemetry.io/collector/client v1.20.0 h1:o60wPcj5nLtaRenF+1E5p4QXFS3TDL6vHlw+GOon3rg= +go.opentelemetry.io/collector/client v1.20.0/go.mod h1:6aqkszco9FaLWCxyJEVam6PP7cUa8mPRIXeS5eZGj0U= +go.opentelemetry.io/collector/component v0.114.0 h1:SVGbm5LvHGSTEDv7p92oPuBgK5tuiWR82I9+LL4TtBE= +go.opentelemetry.io/collector/component v0.114.0/go.mod h1:MLxtjZ6UVHjDxSdhGLuJfHBHvfl1iT/Y7IaQPD24Eww= +go.opentelemetry.io/collector/component/componentstatus v0.114.0 h1:y9my/xink8KB5lK8zFAjgB2+pEh0QYy5TM972fxZY9w= +go.opentelemetry.io/collector/component/componentstatus v0.114.0/go.mod h1:RIoeCYZpPaae7QLE/1RacqzhHuXBmzRAk9H/EwYtIIs= +go.opentelemetry.io/collector/component/componenttest v0.114.0 h1:GM4FTTlfeXoVm6sZYBHImwlRN8ayh2oAfUhvaFj7Zo8= +go.opentelemetry.io/collector/component/componenttest v0.114.0/go.mod h1:ZZEJMtbJtoVC/3/9R1HzERq+cYQRxuMFQrPCpfZ4Xos= +go.opentelemetry.io/collector/config/configauth v0.114.0 h1:R2sJ6xpsLYGH0yU0vCxotzBYDKR/Hrjv0A7y9lwMyiw= +go.opentelemetry.io/collector/config/configauth v0.114.0/go.mod h1:3Z24KcCpG+WYCeQYfs/cNp5cP2BDeOqLCtOEgs/rPqM= +go.opentelemetry.io/collector/config/configcompression v1.20.0 h1:H/mvz7J/5z+O74YsO0t2tk+REnO2tzLM8TgIQ4AZ5w0= +go.opentelemetry.io/collector/config/configcompression v1.20.0/go.mod h1:pnxkFCLUZLKWzYJvfSwZnPrnm0twX14CYj2ADth5xiU= +go.opentelemetry.io/collector/config/configgrpc v0.114.0 h1:3kGI9CljNtzClF+9sg7NWZ5qUoy4qZvGxv9q3phDn7k= +go.opentelemetry.io/collector/config/configgrpc v0.114.0/go.mod h1:IHSyqSdjPXW34aif/8BhNlXxRcIVV6026jVi0/+ituY= +go.opentelemetry.io/collector/config/confighttp v0.114.0 h1:DjGsBvVm+mGK3IpJBaXianWhwcxEC1fF33cpuC1LY/I= +go.opentelemetry.io/collector/config/confighttp v0.114.0/go.mod h1:nrlNLxOZ+4JQaV9j0TiqQV7LOHhrRivPrT8nQRHED3Q= +go.opentelemetry.io/collector/config/confignet v1.20.0 h1:LrM6AuiY8N/woTP4SWhL2V0562JXwJs9MRNFZJFLtRY= +go.opentelemetry.io/collector/config/confignet v1.20.0/go.mod h1:o3v4joAEjvLwntqexg5ixMqRrU1+Vst+jWuCUaBNgOg= +go.opentelemetry.io/collector/config/configopaque v1.20.0 h1:2I48zKiyyyYqjm7y0B9OLp24ku2ZSX3nCHG0r5FdWOQ= +go.opentelemetry.io/collector/config/configopaque v1.20.0/go.mod h1:6zlLIyOoRpJJ+0bEKrlZOZon3rOp5Jrz9fMdR4twOS4= +go.opentelemetry.io/collector/config/configretry v1.20.0 h1:z679mrMlW2a6tOOYPGdrS/QfALxdzWLQUOpH8Uu+D5Y= +go.opentelemetry.io/collector/config/configretry v1.20.0/go.mod h1:KvQF5cfphq1rQm1dKR4eLDNQYw6iI2fY72NMZVa+0N0= +go.opentelemetry.io/collector/config/configtelemetry v0.114.0 h1:kjLeyrumge6wsX6ZIkicdNOlBXaEyW2PI2ZdVXz/rzY= +go.opentelemetry.io/collector/config/configtelemetry v0.114.0/go.mod h1:R0MBUxjSMVMIhljuDHWIygzzJWQyZHXXWIgQNxcFwhc= +go.opentelemetry.io/collector/config/configtls v1.20.0 h1:hNlJdwfyY5Qe54RLJ41lfLqKTn9ypkR7sk7JNCcSe2U= +go.opentelemetry.io/collector/config/configtls v1.20.0/go.mod h1:sav/txSHguadTYlSSK+BJO2ljJeYEtRoBahgzWAguYg= +go.opentelemetry.io/collector/config/internal v0.114.0 h1:uWSDWTJb8T6xRjKD9/XmEARakXnxgYVYKUeId78hErc= +go.opentelemetry.io/collector/config/internal v0.114.0/go.mod h1:yC7E4h1Uj0SubxcFImh6OvBHFTjMh99+A5PuyIgDWqc= +go.opentelemetry.io/collector/confmap v1.20.0 h1:ARfOwmkKxFOud1njl03yAHQ30+uenlzqCO6LBYamDTE= +go.opentelemetry.io/collector/confmap v1.20.0/go.mod h1:DMpd9Ay/ffls3JoQBQ73vWeRsz1rNuLbwjo6WtjSQus= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.20.0 h1:I3xDecFXJVZBo5zJS7Y5SWBjF22XDWGZJgwotiwA5QM= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.20.0/go.mod h1:CF0l8V8MNv+Wag8UkqObotFnlhMzdTFuk4/6kylKwYU= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.20.0 h1:wWxvQ7wj+1O9yDGM5m1HPEz8FJewAHAUWadAAi0KVbM= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.20.0/go.mod h1:/5HWIPjGYk8IUurs1CZUSjGaSsaQyJsfR8+Zs5rGJ6Y= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.20.0 h1:YS1nB8vDoCS8IlfX5OP3QGS90y/hfflwZ7CoPQcAOlU= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.20.0/go.mod h1:aV4UfkgcJ3eyXvfd3m694omN++1c96Joitab+YL6Xks= +go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.17.0 h1:lI1uHXqTklVCFXgTPIKwUb8PTP/EpMF2VxwT48fQ54w= +go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.17.0/go.mod h1:1Vhweh5dDeTUOmcw5WSGHPgHUwZzouf3y2dQr4yFWjA= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.20.0 h1:jSXTojCPI6Xr98m99nF7qbQFnw3INLEOHRcqcHS+lak= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.20.0/go.mod h1:Pu95O2JE3R+0BBTbe4gpAC8ms3w6FbICHJw3WvGWrjs= +go.opentelemetry.io/collector/connector v0.114.0 h1:efGAeTCtg8zp5Hyd7Am8kBUgsSxWEFlFtAu4OX4mcEA= +go.opentelemetry.io/collector/connector v0.114.0/go.mod h1:8DhGgD8RhkF0ooELl4NOPPD/wgHuXHmY7g90RwJ2eNo= +go.opentelemetry.io/collector/connector/connectorprofiles v0.114.0 h1:uVs9gy3UfQBmH0636ouIbGIoWis7zmKN+ny4XOGm36U= +go.opentelemetry.io/collector/connector/connectorprofiles v0.114.0/go.mod h1:X681qFEAsEPMDQ0pMsD/3DqePw58sfLew1QbBKvGnmw= +go.opentelemetry.io/collector/connector/connectortest v0.114.0 h1:Fpy1JHyNOLdVzNcmxUY6Jwxdz6JDcTXL1NCfw8k1AOc= +go.opentelemetry.io/collector/connector/connectortest v0.114.0/go.mod h1:1zaAlODuL9iNyfyjHQeGCpbcaUjf5b68t8LqlwHKBNA= +go.opentelemetry.io/collector/consumer v0.114.0 h1:1zVaHvfIZowGwZRitRBRo3i+RP2StlU+GClYiofSw0Q= +go.opentelemetry.io/collector/consumer v0.114.0/go.mod h1:d+Mrzt9hsH1ub3zmwSlnQVPLeTYir4Mgo7CrWfnncN4= +go.opentelemetry.io/collector/consumer/consumererror v0.114.0 h1:r2YiELfWerb40FHD23V04gNjIkLUcjEKGxI4Vtm2iO4= +go.opentelemetry.io/collector/consumer/consumererror v0.114.0/go.mod h1:MzIrLQ5jptO2egypolhlAbZsWZr29WC4FhSxQjnxcvg= +go.opentelemetry.io/collector/consumer/consumererror/consumererrorprofiles v0.114.0 h1:0IpwQXyHDXhIaLA6w2VlD6Ca0iuX4wlfCDiF+BKCwEo= +go.opentelemetry.io/collector/consumer/consumererror/consumererrorprofiles v0.114.0/go.mod h1:9pKeVRcCT92x5/UIULMLAop+J23VYJCWSZcVhmbup5I= +go.opentelemetry.io/collector/consumer/consumerprofiles v0.114.0 h1:5pXYy3E6UK5Huu3aQbsYL8B6E6MyWx4fvXXDn+oXZaA= +go.opentelemetry.io/collector/consumer/consumerprofiles v0.114.0/go.mod h1:PMq3f54KcJQO4v1tue0QxQScu7REFVADlXxXSAYMiN0= +go.opentelemetry.io/collector/consumer/consumertest v0.114.0 h1:isaTwJK5DOy8Bs7GuLq23ejfgj8gLIo5dOUvkRnLF4g= +go.opentelemetry.io/collector/consumer/consumertest v0.114.0/go.mod h1:GNeLPkfRPdh06n/Rv1UKa/cAtCKjN0a7ADyHjIj4HFE= +go.opentelemetry.io/collector/exporter v0.114.0 h1:5/0BBpXuCJQSQ5SQf31g7j6T4XEKkyx9mZMcA2rS5e8= +go.opentelemetry.io/collector/exporter v0.114.0/go.mod h1:atpd0wWXgh5LAZ0REU/d/Ti/q50HDfnlBIjMjJQlKFg= +go.opentelemetry.io/collector/exporter/debugexporter v0.114.0 h1:7t1ij8fuV510SRT+eabgbl4973DaAtGmTx0RuGJy8DU= +go.opentelemetry.io/collector/exporter/debugexporter v0.114.0/go.mod h1:rC8PHnf1MniZN4ryU4i5GsyXKRkMEGwEGF2hxHx/JyU= +go.opentelemetry.io/collector/exporter/exporterhelper/exporterhelperprofiles v0.114.0 h1:W/KsD33oMg/M7Kd5/m2riliWrTg3W9IgQVNeZL3cZjs= +go.opentelemetry.io/collector/exporter/exporterhelper/exporterhelperprofiles v0.114.0/go.mod h1:Fh47qYBjX+jm+mpWBcqmaaQucZ6KiKm5P0drEt+xNRc= +go.opentelemetry.io/collector/exporter/exporterprofiles v0.114.0 h1:/wmWOSBHcvtz3Pbv7+rWCqPPQuNvYaoidKKaOqZsLKs= +go.opentelemetry.io/collector/exporter/exporterprofiles v0.114.0/go.mod h1:epRYTkyJZTSQZBJflMGHUyUo2EdLPhsaZEyo5Qm848A= +go.opentelemetry.io/collector/exporter/exportertest v0.114.0 h1:vo0idBJT+QACSM1KpjVLm9VeiXVwO7y4UnMpGxN6EyM= +go.opentelemetry.io/collector/exporter/exportertest v0.114.0/go.mod h1:420ssFrhaphneybstbMeSIiqSRoaBARPgO71O17foaM= +go.opentelemetry.io/collector/exporter/otlpexporter v0.114.0 h1:SC/xZNCB/eCVflrhDFX4WtrpvBPsZhmXVuSvgHQBsB8= +go.opentelemetry.io/collector/exporter/otlpexporter v0.114.0/go.mod h1:q1273aUuYewtDUFwizv0AKu5/D+gbQAi8UFLKDv1eMk= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.114.0 h1:+nPJraioPpLS2Kj3+YIfErDDFHsLX/5oPMSMAYKoggM= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.114.0/go.mod h1:O+75KYmyJwK61VDsW7LHo2qFFXCTf3kEJH3ZvW1bb4Y= +go.opentelemetry.io/collector/extension v0.114.0 h1:9Qb92y8hD2WDC5aMDoj4JNQN+/5BQYJWPUPzLXX+iGw= +go.opentelemetry.io/collector/extension v0.114.0/go.mod h1:Yk2/1ptVgfTr12t+22v93nYJpioP14pURv2YercSzU0= +go.opentelemetry.io/collector/extension/auth v0.114.0 h1:1K2qh4yvG8kKR/sTAobI/rw5VxzPZoKcl3FmC195vvo= +go.opentelemetry.io/collector/extension/auth v0.114.0/go.mod h1:IjtsG+jUVJB0utKF8dAK8pLutRun3aEgASshImzsw/U= +go.opentelemetry.io/collector/extension/experimental/storage v0.114.0 h1:hLyX9UvmY0t6iBnk3CqvyNck2U0QjPACekj7pDRx2hA= +go.opentelemetry.io/collector/extension/experimental/storage v0.114.0/go.mod h1:WqYRQVJjJLE1rm+y/ks1wPdPRGWePEvE1VO07xm2J2k= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.114.0 h1:3OHll7gp5XIu7FVgon+koShPy797nze6EjCDokFUG7w= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.114.0/go.mod h1:f0KdeLmE2jWVBmJ1U4WmfAtz1/tQUErGPfhPLKCQ49U= +go.opentelemetry.io/collector/extension/extensiontest v0.114.0 h1:ibXDms1qrswlvlR6b3d2BeyI8sXUXoFV11yOi9Sop8o= +go.opentelemetry.io/collector/extension/extensiontest v0.114.0/go.mod h1:/bOYmqu5yTDfI1bJZUxFqm8ZtmcodpquebiSxiQxtDY= +go.opentelemetry.io/collector/extension/zpagesextension v0.114.0 h1:JosqAcdWw7IGsURJNR8f17xmaGCQEtKhQt9tM0T/DEg= +go.opentelemetry.io/collector/extension/zpagesextension v0.114.0/go.mod h1:+VO4p2GZvmIMqCVyIfS/U85Xqg+HIOe+mdl/ya+jVTE= +go.opentelemetry.io/collector/featuregate v1.20.0 h1:Mi7nMy/q52eruI+6jWnMKUOeM55XvwoPnGcdB1++O8c= +go.opentelemetry.io/collector/featuregate v1.20.0/go.mod h1:47xrISO71vJ83LSMm8+yIDsUbKktUp48Ovt7RR6VbRs= +go.opentelemetry.io/collector/filter v0.114.0 h1:5I97yblUxc6rXCYRn542aSrsNQLo/dE+87XROW2b5oU= +go.opentelemetry.io/collector/filter v0.114.0/go.mod h1:Nxwc+RD9AH4y/qYtkTP+Ac19CxgW5GAB+sJU4ACLr6g= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.114.0 h1:JM9huYqy5LTzmuxQmbPST3l5Ez5kJNit28c6WFWls34= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.114.0/go.mod h1:V28tDU4Wvf1PfW1Ty/SBL9tpKul2iYGno/HkCWGDrj0= +go.opentelemetry.io/collector/internal/memorylimiter v0.114.0 h1:UpKQ/GtWw7Mh/PjR03NdgR9PG7uT7mnfbQVxpDQVBgk= +go.opentelemetry.io/collector/internal/memorylimiter v0.114.0/go.mod h1:QUZr3bBguTmgLJUFuqVVsOxKr7Y/2JO49k3I1tUH88U= +go.opentelemetry.io/collector/internal/sharedcomponent v0.114.0 h1:DjX9ubjkKDnioQB03FYc40FTyhR25CdobMfjinKkZ1w= +go.opentelemetry.io/collector/internal/sharedcomponent v0.114.0/go.mod h1:lYlFiGIjPjhwTS/Xc+toJ9o3D8A6cCHuK1JX+ZbujVs= +go.opentelemetry.io/collector/otelcol v0.114.0 h1:d/nmYc+adzZ70g4zBMtgujGHVNulF59ExCpuM/3ZKV4= +go.opentelemetry.io/collector/otelcol v0.114.0/go.mod h1:DGmFFao5jHSwD6G1HjUjs0CYcyrTau+u7GjTRUGKN+4= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.114.0 h1:Em5e1EgrPrS90EWDWLJHCvyFIDl5PIq1DuW9zd8F3pY= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.114.0/go.mod h1:YAs78SaOJsf1HNWrNH+GFTdkS58dpQI98cok6gZP4Lg= +go.opentelemetry.io/collector/pdata v1.20.0 h1:ePcwt4bdtISP0loHaE+C9xYoU2ZkIvWv89Fob16o9SM= +go.opentelemetry.io/collector/pdata v1.20.0/go.mod h1:Ox1YVLe87cZDB/TL30i4SUz1cA5s6AM6SpFMfY61ICs= +go.opentelemetry.io/collector/pdata/pprofile v0.114.0 h1:pUNfTzsI/JUTiE+DScDM4lsrPoxnVNLI2fbTxR/oapo= +go.opentelemetry.io/collector/pdata/pprofile v0.114.0/go.mod h1:4aNcj6WM1n1uXyFSXlhVs4ibrERgNYsTbzcYI2zGhxA= +go.opentelemetry.io/collector/pdata/testdata v0.114.0 h1:+AzszWSL1i4K6meQ8rU0JDDW55SYCXa6FVqfDixhhTo= +go.opentelemetry.io/collector/pdata/testdata v0.114.0/go.mod h1:bv8XFdCTZxG2MQB5l9dKxSxf5zBrcodwO6JOy1+AxXM= +go.opentelemetry.io/collector/pipeline v0.114.0 h1:v3YOhc5z0tD6QbO5n/pnftpIeroihM2ks9Z2yKPCcwY= +go.opentelemetry.io/collector/pipeline v0.114.0/go.mod h1:4vOvjVsoYTHVGTbfFwqfnQOSV2K3RKUHofh3jNRc2Mg= +go.opentelemetry.io/collector/pipeline/pipelineprofiles v0.114.0 h1:LZgxMQ2zXcz8ILBefhxpZBpn/Rx+TJTncIIQy0LgtgY= +go.opentelemetry.io/collector/pipeline/pipelineprofiles v0.114.0/go.mod h1:bmyqQCJWcA53/GtqZJ2ahwmLdFl6UelFH2nR6OJFqpw= +go.opentelemetry.io/collector/processor v0.114.0 h1:6bqQgLL7BtKrNv4YkEOGjZfkcfZv/ciJSQx1epGG9Zk= +go.opentelemetry.io/collector/processor v0.114.0/go.mod h1:DV/wa+nAmSHIDeD9NblPwkY9PbgtDQAZJ+PE5biZwPc= +go.opentelemetry.io/collector/processor/batchprocessor v0.114.0 h1:Xu+pdPGIh6gLqHW5oYJsiim1mbnG85QaaUQy0YPoL+c= +go.opentelemetry.io/collector/processor/batchprocessor v0.114.0/go.mod h1:emnnL5CaliCnWjXNpNixqpvn7uc/kyUTv2939J/reMY= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.114.0 h1:gfzShbdzhbA2lsRSx2z9i9QO/FJwAzOSrBW2ObPqf38= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.114.0/go.mod h1:leElNJO5dnpOg0o1Gr2Ok59HKADRznbrZ3u2oTfx50Q= +go.opentelemetry.io/collector/processor/processorprofiles v0.114.0 h1:+P/1nLouEXTnN8DVQl+qWwO4BTkQyNPG9t/FrpUqrSI= +go.opentelemetry.io/collector/processor/processorprofiles v0.114.0/go.mod h1:3fuHeNIpINwx3bqFMprmDJyr6y5tWoWbJH599kltO5Y= +go.opentelemetry.io/collector/processor/processortest v0.114.0 h1:3FTaVXAp0LoVmUJn1ewBFckAby7AHa6/Kcdj0xuW14c= +go.opentelemetry.io/collector/processor/processortest v0.114.0/go.mod h1:OgsdOs1Fv5ZGTTJPF5nNIUJh2YkuV1acWd73yWgnti4= +go.opentelemetry.io/collector/receiver v0.114.0 h1:90SAnXAjNq7/k52/pFmmb06Cf1YauoPYtbio4aOXafY= +go.opentelemetry.io/collector/receiver v0.114.0/go.mod h1:KUGT0/D953LXbGH/D3lLPU8yrU3HfWnUqpt4W4hSOnE= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.114.0 h1:8ASaxRWLe8P0pefOiYbCSZ0aXmwE4K06I8FBGc/n+J0= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.114.0/go.mod h1:3vjOvYBWGUVzuaovoumMbNHEIK3PqDs5rzEyd/nzsLU= +go.opentelemetry.io/collector/receiver/receiverprofiles v0.114.0 h1:ibhEfGpvNB3yrtpl2jYFabrunMk1hurxvMYpM0b1Ck4= +go.opentelemetry.io/collector/receiver/receiverprofiles v0.114.0/go.mod h1:UZyRfaasw+NLvN10AN8IQnmj5tQ3BOUH1uP2ctpO9f0= +go.opentelemetry.io/collector/receiver/receivertest v0.114.0 h1:D+Kh9t2n4asTnM+TiSxbrKlUemLZandWntj17BJWWb0= +go.opentelemetry.io/collector/receiver/receivertest v0.114.0/go.mod h1:mNSHQ13vFmqD+VAcRzLjStFBejbcWUn2Mp0pAd7Op+U= +go.opentelemetry.io/collector/semconv v0.114.0 h1:/eKcCJwZepQUtEuFuxa0thx2XIOvhFpaf214ZG1a11k= +go.opentelemetry.io/collector/semconv v0.114.0/go.mod h1:zCJ5njhWpejR+A40kiEoeFm1xq1uzyZwMnRNX6/D82A= +go.opentelemetry.io/collector/service v0.114.0 h1:MYF/4nH1CgtiLx09503xPAAUZefCzG1kaO+oanwX590= +go.opentelemetry.io/collector/service v0.114.0/go.mod h1:xH5/RapJdf5Ohh8iU8J0ZstfFYciP1oJPesiByteZxo= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= +go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= +go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0 h1:PQPXYscmwbCp76QDvO4hMngF2j8Bx/OTV86laEl8uqo= +go.opentelemetry.io/contrib/propagators/b3 v1.31.0/go.mod h1:jbqfV8wDdqSDrAYxVpXQnpM0XFMq2FtDesblJ7blOwQ= +go.opentelemetry.io/contrib/zpages v0.56.0 h1:W7vP6s3juzL5KiHpr41zLNmsJ0QAZudYu8ay0zGAoko= +go.opentelemetry.io/contrib/zpages v0.56.0/go.mod h1:IxPRP4TYHw9jLeaEOSDIiA9zmyJNZNO6sbW55iMvSXs= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= +go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= 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= @@ -1012,305 +798,123 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= -golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/arch v0.12.0 h1:UsYJhbzPYGsT0HbEdmYcqtCv8UNGvnaL561NnIUvaKg= +golang.org/x/arch v0.12.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -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.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.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= 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= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk= golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -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-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= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-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-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.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= 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.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.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-20201020160332-67f06af15bc9/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.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/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-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= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-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-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-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= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.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.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.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/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 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.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/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= 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= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 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.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.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/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/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.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= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -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-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/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-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= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= -golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= +golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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.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= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -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.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 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/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= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -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-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -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/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= 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= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -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.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= 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= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= 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= @@ -1322,19 +926,12 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD 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= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= @@ -1343,8 +940,6 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -1355,44 +950,23 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 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= -k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -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.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.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/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0= +k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk= +k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw= +k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc= +k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs= 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/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= 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= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/internal/bus/fake_message_pipe.go b/internal/bus/busfakes/fake_message_pipe.go similarity index 67% rename from internal/bus/fake_message_pipe.go rename to internal/bus/busfakes/fake_message_pipe.go index e7de9a5362..d0c697b30e 100644 --- a/internal/bus/fake_message_pipe.go +++ b/internal/bus/busfakes/fake_message_pipe.go @@ -3,22 +3,24 @@ // 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 bus +package busfakes import ( "context" "sync" + + "github.com/nginx/agent/v3/internal/bus" ) // FakeMessagePipe is a mock message pipe type FakeMessagePipe struct { - plugins []Plugin - messages []*Message - processedMessages []*Message + plugins []bus.Plugin + messages []*bus.Message + processedMessages []*bus.Message messagesLock sync.Mutex } -var _ MessagePipeInterface = &FakeMessagePipe{} +var _ bus.MessagePipeInterface = &FakeMessagePipe{} func NewFakeMessagePipe() *FakeMessagePipe { return &FakeMessagePipe{ @@ -26,32 +28,45 @@ func NewFakeMessagePipe() *FakeMessagePipe { } } -func (p *FakeMessagePipe) Register(size int, plugins []Plugin) error { +func (p *FakeMessagePipe) Register(size int, plugins []bus.Plugin) error { p.plugins = append(p.plugins, plugins...) return nil } func (p *FakeMessagePipe) DeRegister(ctx context.Context, pluginNames []string) error { - var plugins []Plugin + var plugins []bus.Plugin plugins = p.findPlugins(pluginNames, plugins) for _, plugin := range plugins { - index := getIndex(plugin.Info().Name, p.plugins) + index := p.GetIndex(plugin.Info().Name, p.plugins) p.unsubscribePlugin(ctx, index, plugin) } return nil } -func (p *FakeMessagePipe) unsubscribePlugin(ctx context.Context, index int, plugin Plugin) { +func (p *FakeMessagePipe) GetIndex(pluginName string, plugins []bus.Plugin) int { + for index, plugin := range plugins { + if pluginName == plugin.Info().Name { + return index + } + } + + return -1 +} + +func (p *FakeMessagePipe) unsubscribePlugin(ctx context.Context, index int, plugin bus.Plugin) { if index != -1 { p.plugins = append(p.plugins[:index], p.plugins[index+1:]...) - plugin.Close(ctx) + err := plugin.Close(ctx) + if err != nil { + return + } } } -func (p *FakeMessagePipe) findPlugins(pluginNames []string, plugins []Plugin) []Plugin { +func (p *FakeMessagePipe) findPlugins(pluginNames []string, plugins []bus.Plugin) []bus.Plugin { for _, name := range pluginNames { for _, plugin := range p.plugins { if plugin.Info().Name == name { @@ -63,21 +78,21 @@ func (p *FakeMessagePipe) findPlugins(pluginNames []string, plugins []Plugin) [] return plugins } -func (p *FakeMessagePipe) Process(ctx context.Context, msgs ...*Message) { +func (p *FakeMessagePipe) Process(_ context.Context, msgs ...*bus.Message) { p.messagesLock.Lock() defer p.messagesLock.Unlock() p.messages = append(p.messages, msgs...) } -func (p *FakeMessagePipe) GetMessages() []*Message { +func (p *FakeMessagePipe) GetMessages() []*bus.Message { p.messagesLock.Lock() defer p.messagesLock.Unlock() return p.messages } -func (p *FakeMessagePipe) GetProcessedMessages() []*Message { +func (p *FakeMessagePipe) GetProcessedMessages() []*bus.Message { return p.processedMessages } @@ -85,8 +100,8 @@ func (p *FakeMessagePipe) ClearMessages() { p.messagesLock.Lock() defer p.messagesLock.Unlock() - p.processedMessages = []*Message{} - p.messages = []*Message{} + p.processedMessages = []*bus.Message{} + p.messages = []*bus.Message{} } func (p *FakeMessagePipe) Run(ctx context.Context) { @@ -101,7 +116,7 @@ func (p *FakeMessagePipe) Run(ctx context.Context) { } func (p *FakeMessagePipe) RunWithoutInit(ctx context.Context) { - var message *Message + var message *bus.Message for len(p.messages) > 0 { message, p.messages = p.messages[0], p.messages[1:] @@ -112,7 +127,7 @@ func (p *FakeMessagePipe) RunWithoutInit(ctx context.Context) { } } -func (p *FakeMessagePipe) GetPlugins() []Plugin { +func (p *FakeMessagePipe) GetPlugins() []bus.Plugin { return p.plugins } diff --git a/internal/bus/message_pipe.go b/internal/bus/message_pipe.go index 6c3784ec7e..483b39456d 100644 --- a/internal/bus/message_pipe.go +++ b/internal/bus/message_pipe.go @@ -93,7 +93,7 @@ func (p *MessagePipe) DeRegister(ctx context.Context, pluginNames []string) erro plugins := p.findPlugins(pluginNames) for _, plugin := range plugins { - index := getIndex(plugin.Info().Name, p.plugins) + index := p.GetIndex(plugin.Info().Name, p.plugins) err := p.unsubscribePlugin(ctx, index, plugin) if err != nil { @@ -151,12 +151,15 @@ func (p *MessagePipe) unsubscribePlugin(ctx context.Context, index int, plugin P if index != -1 { p.plugins = append(p.plugins[:index], p.plugins[index+1:]...) - plugin.Close(ctx) + err := plugin.Close(ctx) + if err != nil { + return err + } for _, subscription := range plugin.Subscriptions() { - err := p.bus.Unsubscribe(subscription, plugin.Process) - if err != nil { - return err + unsubErr := p.bus.Unsubscribe(subscription, plugin.Process) + if unsubErr != nil { + return unsubErr } } } @@ -165,7 +168,7 @@ func (p *MessagePipe) unsubscribePlugin(ctx context.Context, index int, plugin P } func (p *MessagePipe) findPlugins(pluginNames []string) []Plugin { - plugins := []Plugin{} + var plugins []Plugin for _, name := range pluginNames { for _, plugin := range p.plugins { @@ -178,7 +181,7 @@ func (p *MessagePipe) findPlugins(pluginNames []string) []Plugin { return plugins } -func getIndex(pluginName string, plugins []Plugin) int { +func (p *MessagePipe) GetIndex(pluginName string, plugins []Plugin) int { for index, plugin := range plugins { if pluginName == plugin.Info().Name { return index diff --git a/internal/collector/factories.go b/internal/collector/factories.go index df3a431f64..92fa823ccc 100644 --- a/internal/collector/factories.go +++ b/internal/collector/factories.go @@ -14,22 +14,10 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension" "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" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbyattrsprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/groupbytraceprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/k8sattributesprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricsgenerationprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/redactionprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/remotetapprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/routingprocessor" - "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/hostmetricsreceiver" "go.opentelemetry.io/collector/component" @@ -89,7 +77,7 @@ func OTelComponentFactories() (otelcol.Factories, error) { } func createConnectorFactories() (map[component.Type]connector.Factory, error) { - connectorsList := []connector.Factory{} + var connectorsList []connector.Factory return connector.MakeFactoryMap(connectorsList...) } @@ -119,23 +107,11 @@ func createProcessorFactories() (map[component.Type]processor.Factory, error) { processorList := []processor.Factory{ attributesprocessor.NewFactory(), batchprocessor.NewFactory(), - cumulativetodeltaprocessor.NewFactory(), deltatorateprocessor.NewFactory(), filterprocessor.NewFactory(), - groupbyattrsprocessor.NewFactory(), - groupbytraceprocessor.NewFactory(), - k8sattributesprocessor.NewFactory(), memorylimiterprocessor.NewFactory(), - metricsgenerationprocessor.NewFactory(), - metricstransformprocessor.NewFactory(), - probabilisticsamplerprocessor.NewFactory(), redactionprocessor.NewFactory(), - remotetapprocessor.NewFactory(), - resourcedetectionprocessor.NewFactory(), resourceprocessor.NewFactory(), - routingprocessor.NewFactory(), - spanprocessor.NewFactory(), - tailsamplingprocessor.NewFactory(), transformprocessor.NewFactory(), } diff --git a/internal/collector/factories_test.go b/internal/collector/factories_test.go index 5cefda51eb..339c99af62 100644 --- a/internal/collector/factories_test.go +++ b/internal/collector/factories_test.go @@ -7,18 +7,19 @@ package collector import ( "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/stretchr/testify/assert" ) -func TestOTelComponentFactories(t *testing.T) { +func TestOTelComponentFactoriesDefault(t *testing.T) { factories, err := OTelComponentFactories() require.NoError(t, err, "OTelComponentFactories should not return an error") assert.NotNil(t, factories, "factories should not be nil") assert.Len(t, factories.Receivers, 4) - assert.Len(t, factories.Processors, 20) + assert.Len(t, factories.Processors, 8) assert.Len(t, factories.Exporters, 4) assert.Len(t, factories.Extensions, 3) assert.Empty(t, factories.Connectors) diff --git a/internal/collector/nginxossreceiver/README.md b/internal/collector/nginxossreceiver/README.md index c80c890386..29faea3762 100644 --- a/internal/collector/nginxossreceiver/README.md +++ b/internal/collector/nginxossreceiver/README.md @@ -16,8 +16,10 @@ You must also configure an access log as well. Please see [Setting Up the Access ### Receiver Config The following settings are required: - -- `endpoint` (default: `http://localhost:80/status`): The URL of the NGINX status endpoint +- `api_details`: Details for the NGINX status endpoint. + - `url`: (default: `http://localhost:80/status`): The URL of the NGINX status endpoint. + - `listen`: (default: `localhost:80`): The listen directive of the NGINX status endpoint. + - `location`: (default: `/status`): The location directive of the NGINX status endpoint. The following settings are optional: @@ -34,7 +36,10 @@ Example: ```yaml receivers: nginx: - endpoint: "http://localhost:80/status" + api_details: + url: "http://localhost:80/status" + listen: "localhost:80" + location: "/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\"" diff --git a/internal/collector/nginxossreceiver/documentation.md b/internal/collector/nginxossreceiver/documentation.md index 2a2aa19fe4..7cbfe0cbd5 100644 --- a/internal/collector/nginxossreceiver/documentation.md +++ b/internal/collector/nginxossreceiver/documentation.md @@ -12,7 +12,7 @@ metrics: enabled: false ``` -### nginx.http.conn +### nginx.http.connections The total number of connections. @@ -24,9 +24,9 @@ The total number of connections. | Name | Description | Values | | ---- | ----------- | ------ | -| nginx.conn.outcome | The outcome of the connection. | Str: ``ACCEPTED``, ``ACTIVE``, ``HANDLED``, ``READING``, ``WRITING``, ``WAITING`` | +| nginx.connections.outcome | The outcome of the connection. | Str: ``ACCEPTED``, ``ACTIVE``, ``HANDLED``, ``READING``, ``WRITING``, ``WAITING`` | -### nginx.http.conn.count +### nginx.http.connections.count The current number of connections. @@ -38,7 +38,7 @@ The current number of connections. | Name | Description | Values | | ---- | ----------- | ------ | -| nginx.conn.outcome | The outcome of the connection. | Str: ``ACCEPTED``, ``ACTIVE``, ``HANDLED``, ``READING``, ``WRITING``, ``WAITING`` | +| nginx.connections.outcome | The outcome of the connection. | Str: ``ACCEPTED``, ``ACTIVE``, ``HANDLED``, ``READING``, ``WRITING``, ``WAITING`` | ### nginx.http.requests diff --git a/internal/collector/nginxossreceiver/factory.go b/internal/collector/nginxossreceiver/factory.go index 55bea543dd..a17fc0433f 100644 --- a/internal/collector/nginxossreceiver/factory.go +++ b/internal/collector/nginxossreceiver/factory.go @@ -44,7 +44,7 @@ func createMetricsReceiver( ns := stubstatus.NewScraper(params, cfg) scraperOpts := []scraperhelper.ScraperControllerOption{ - scraperhelper.AddScraper(ns), + scraperhelper.AddScraperWithType(metadata.Type, ns), } if len(cfg.AccessLogs) > 0 { @@ -52,7 +52,7 @@ func createMetricsReceiver( if err != nil { logger.Errorf("Failed to initialize NGINX Access Log scraper: %s", err.Error()) } else { - scraperOpts = append(scraperOpts, scraperhelper.AddScraper(nals)) + scraperOpts = append(scraperOpts, scraperhelper.AddScraperWithType(metadata.Type, nals)) } } diff --git a/internal/collector/nginxossreceiver/factory_test.go b/internal/collector/nginxossreceiver/factory_test.go index b218ed56ff..ca4a67137f 100644 --- a/internal/collector/nginxossreceiver/factory_test.go +++ b/internal/collector/nginxossreceiver/factory_test.go @@ -34,7 +34,7 @@ func TestValidConfig(t *testing.T) { func TestCreateMetricsReceiver(t *testing.T) { factory := NewFactory() - metricsReceiver, err := factory.CreateMetricsReceiver( + metricsReceiver, err := factory.CreateMetrics( context.Background(), receivertest.NewNopSettings(), &config.Config{ diff --git a/internal/collector/nginxossreceiver/internal/config/config.go b/internal/collector/nginxossreceiver/internal/config/config.go index 5d8db53dae..73f5676065 100644 --- a/internal/collector/nginxossreceiver/internal/config/config.go +++ b/internal/collector/nginxossreceiver/internal/config/config.go @@ -22,11 +22,18 @@ const ( type Config struct { confighttp.ClientConfig `mapstructure:",squash"` + APIDetails APIDetails `mapstructure:"api_details"` AccessLogs []AccessLog `mapstructure:"access_logs"` MetricsBuilderConfig metadata.MetricsBuilderConfig `mapstructure:",squash"` scraperhelper.ControllerConfig `mapstructure:",squash"` } +type APIDetails struct { + URL string `mapstructure:"url"` + Listen string `mapstructure:"listen"` + Location string `mapstructure:"location"` +} + type AccessLog struct { LogFormat string `mapstructure:"log_format"` FilePath string `mapstructure:"file_path"` @@ -40,10 +47,14 @@ func CreateDefaultConfig() component.Config { return &Config{ ControllerConfig: cfg, ClientConfig: confighttp.ClientConfig{ - Endpoint: "http://localhost:80/status", - Timeout: defaultClientTimeout, + Timeout: defaultClientTimeout, }, MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(), AccessLogs: []AccessLog{}, + APIDetails: APIDetails{ + URL: "http://localhost:80/status", + Listen: "localhost:80", + Location: "status", + }, } } diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_config.go b/internal/collector/nginxossreceiver/internal/metadata/generated_config.go index 69ac3809b3..c9d2b5cd06 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_config.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_config.go @@ -28,18 +28,18 @@ func (ms *MetricConfig) Unmarshal(parser *confmap.Conf) error { // 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"` + NginxHTTPConnections MetricConfig `mapstructure:"nginx.http.connections"` + NginxHTTPConnectionsCount MetricConfig `mapstructure:"nginx.http.connections.count"` + NginxHTTPRequests MetricConfig `mapstructure:"nginx.http.requests"` + NginxHTTPResponseStatus MetricConfig `mapstructure:"nginx.http.response.status"` } func DefaultMetricsConfig() MetricsConfig { return MetricsConfig{ - NginxHTTPConn: MetricConfig{ + NginxHTTPConnections: MetricConfig{ Enabled: true, }, - NginxHTTPConnCount: MetricConfig{ + NginxHTTPConnectionsCount: MetricConfig{ Enabled: true, }, NginxHTTPRequests: MetricConfig{ diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go b/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go index 2a603a104f..8170179018 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go @@ -25,10 +25,10 @@ func TestMetricsBuilderConfig(t *testing.T) { name: "all_set", want: MetricsBuilderConfig{ Metrics: MetricsConfig{ - NginxHTTPConn: MetricConfig{Enabled: true}, - NginxHTTPConnCount: MetricConfig{Enabled: true}, - NginxHTTPRequests: MetricConfig{Enabled: true}, - NginxHTTPResponseStatus: MetricConfig{Enabled: true}, + NginxHTTPConnections: MetricConfig{Enabled: true}, + NginxHTTPConnectionsCount: MetricConfig{Enabled: true}, + NginxHTTPRequests: MetricConfig{Enabled: true}, + NginxHTTPResponseStatus: MetricConfig{Enabled: true}, }, ResourceAttributes: ResourceAttributesConfig{ InstanceID: ResourceAttributeConfig{Enabled: true}, @@ -40,10 +40,10 @@ func TestMetricsBuilderConfig(t *testing.T) { name: "none_set", want: MetricsBuilderConfig{ Metrics: MetricsConfig{ - NginxHTTPConn: MetricConfig{Enabled: false}, - NginxHTTPConnCount: MetricConfig{Enabled: false}, - NginxHTTPRequests: MetricConfig{Enabled: false}, - NginxHTTPResponseStatus: MetricConfig{Enabled: false}, + NginxHTTPConnections: MetricConfig{Enabled: false}, + NginxHTTPConnectionsCount: MetricConfig{Enabled: false}, + NginxHTTPRequests: MetricConfig{Enabled: false}, + NginxHTTPResponseStatus: MetricConfig{Enabled: false}, }, ResourceAttributes: ResourceAttributesConfig{ InstanceID: ResourceAttributeConfig{Enabled: false}, diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go index dfe01f264b..aab38d343b 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go @@ -12,46 +12,46 @@ import ( "go.opentelemetry.io/collector/receiver" ) -// AttributeNginxConnOutcome specifies the a value nginx.conn.outcome attribute. -type AttributeNginxConnOutcome int +// AttributeNginxConnectionsOutcome specifies the a value nginx.connections.outcome attribute. +type AttributeNginxConnectionsOutcome int const ( - _ AttributeNginxConnOutcome = iota - AttributeNginxConnOutcomeACCEPTED - AttributeNginxConnOutcomeACTIVE - AttributeNginxConnOutcomeHANDLED - AttributeNginxConnOutcomeREADING - AttributeNginxConnOutcomeWRITING - AttributeNginxConnOutcomeWAITING + _ AttributeNginxConnectionsOutcome = iota + AttributeNginxConnectionsOutcomeACCEPTED + AttributeNginxConnectionsOutcomeACTIVE + AttributeNginxConnectionsOutcomeHANDLED + AttributeNginxConnectionsOutcomeREADING + AttributeNginxConnectionsOutcomeWRITING + AttributeNginxConnectionsOutcomeWAITING ) -// String returns the string representation of the AttributeNginxConnOutcome. -func (av AttributeNginxConnOutcome) String() string { +// String returns the string representation of the AttributeNginxConnectionsOutcome. +func (av AttributeNginxConnectionsOutcome) String() string { switch av { - case AttributeNginxConnOutcomeACCEPTED: + case AttributeNginxConnectionsOutcomeACCEPTED: return "ACCEPTED" - case AttributeNginxConnOutcomeACTIVE: + case AttributeNginxConnectionsOutcomeACTIVE: return "ACTIVE" - case AttributeNginxConnOutcomeHANDLED: + case AttributeNginxConnectionsOutcomeHANDLED: return "HANDLED" - case AttributeNginxConnOutcomeREADING: + case AttributeNginxConnectionsOutcomeREADING: return "READING" - case AttributeNginxConnOutcomeWRITING: + case AttributeNginxConnectionsOutcomeWRITING: return "WRITING" - case AttributeNginxConnOutcomeWAITING: + case AttributeNginxConnectionsOutcomeWAITING: 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, +// MapAttributeNginxConnectionsOutcome is a helper map of string to AttributeNginxConnectionsOutcome attribute value. +var MapAttributeNginxConnectionsOutcome = map[string]AttributeNginxConnectionsOutcome{ + "ACCEPTED": AttributeNginxConnectionsOutcomeACCEPTED, + "ACTIVE": AttributeNginxConnectionsOutcomeACTIVE, + "HANDLED": AttributeNginxConnectionsOutcomeHANDLED, + "READING": AttributeNginxConnectionsOutcomeREADING, + "WRITING": AttributeNginxConnectionsOutcomeWRITING, + "WAITING": AttributeNginxConnectionsOutcomeWAITING, } // AttributeNginxStatusRange specifies the a value nginx.status_range attribute. @@ -92,15 +92,15 @@ var MapAttributeNginxStatusRange = map[string]AttributeNginxStatusRange{ "5xx": AttributeNginxStatusRange5xx, } -type metricNginxHTTPConn struct { +type metricNginxHTTPConnections 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") +// init fills nginx.http.connections metric with initial data. +func (m *metricNginxHTTPConnections) init() { + m.data.SetName("nginx.http.connections") m.data.SetDescription("The total number of connections.") m.data.SetUnit("connections") m.data.SetEmptySum() @@ -109,7 +109,7 @@ func (m *metricNginxHTTPConn) init() { m.data.Sum().DataPoints().EnsureCapacity(m.capacity) } -func (m *metricNginxHTTPConn) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxConnOutcomeAttributeValue string) { +func (m *metricNginxHTTPConnections) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxConnectionsOutcomeAttributeValue string) { if !m.config.Enabled { return } @@ -117,18 +117,18 @@ func (m *metricNginxHTTPConn) recordDataPoint(start pcommon.Timestamp, ts pcommo dp.SetStartTimestamp(start) dp.SetTimestamp(ts) dp.SetIntValue(val) - dp.Attributes().PutStr("nginx.conn.outcome", nginxConnOutcomeAttributeValue) + dp.Attributes().PutStr("nginx.connections.outcome", nginxConnectionsOutcomeAttributeValue) } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxHTTPConn) updateCapacity() { +func (m *metricNginxHTTPConnections) 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) { +func (m *metricNginxHTTPConnections) emit(metrics pmetric.MetricSlice) { if m.config.Enabled && m.data.Sum().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) @@ -136,8 +136,8 @@ func (m *metricNginxHTTPConn) emit(metrics pmetric.MetricSlice) { } } -func newMetricNginxHTTPConn(cfg MetricConfig) metricNginxHTTPConn { - m := metricNginxHTTPConn{config: cfg} +func newMetricNginxHTTPConnections(cfg MetricConfig) metricNginxHTTPConnections { + m := metricNginxHTTPConnections{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -145,22 +145,22 @@ func newMetricNginxHTTPConn(cfg MetricConfig) metricNginxHTTPConn { return m } -type metricNginxHTTPConnCount struct { +type metricNginxHTTPConnectionsCount 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") +// init fills nginx.http.connections.count metric with initial data. +func (m *metricNginxHTTPConnectionsCount) init() { + m.data.SetName("nginx.http.connections.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) { +func (m *metricNginxHTTPConnectionsCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxConnectionsOutcomeAttributeValue string) { if !m.config.Enabled { return } @@ -168,18 +168,18 @@ func (m *metricNginxHTTPConnCount) recordDataPoint(start pcommon.Timestamp, ts p dp.SetStartTimestamp(start) dp.SetTimestamp(ts) dp.SetIntValue(val) - dp.Attributes().PutStr("nginx.conn.outcome", nginxConnOutcomeAttributeValue) + dp.Attributes().PutStr("nginx.connections.outcome", nginxConnectionsOutcomeAttributeValue) } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxHTTPConnCount) updateCapacity() { +func (m *metricNginxHTTPConnectionsCount) 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) { +func (m *metricNginxHTTPConnectionsCount) emit(metrics pmetric.MetricSlice) { if m.config.Enabled && m.data.Gauge().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) @@ -187,8 +187,8 @@ func (m *metricNginxHTTPConnCount) emit(metrics pmetric.MetricSlice) { } } -func newMetricNginxHTTPConnCount(cfg MetricConfig) metricNginxHTTPConnCount { - m := metricNginxHTTPConnCount{config: cfg} +func newMetricNginxHTTPConnectionsCount(cfg MetricConfig) metricNginxHTTPConnectionsCount { + m := metricNginxHTTPConnectionsCount{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -303,17 +303,17 @@ func newMetricNginxHTTPResponseStatus(cfg MetricConfig) metricNginxHTTPResponseS // 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. - resourceAttributeIncludeFilter map[string]filter.Filter - resourceAttributeExcludeFilter map[string]filter.Filter - metricNginxHTTPConn metricNginxHTTPConn - metricNginxHTTPConnCount metricNginxHTTPConnCount - metricNginxHTTPRequests metricNginxHTTPRequests - metricNginxHTTPResponseStatus metricNginxHTTPResponseStatus + 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. + resourceAttributeIncludeFilter map[string]filter.Filter + resourceAttributeExcludeFilter map[string]filter.Filter + metricNginxHTTPConnections metricNginxHTTPConnections + metricNginxHTTPConnectionsCount metricNginxHTTPConnectionsCount + metricNginxHTTPRequests metricNginxHTTPRequests + metricNginxHTTPResponseStatus metricNginxHTTPResponseStatus } // metricBuilderOption applies changes to default metrics builder. @@ -328,16 +328,16 @@ func WithStartTime(startTime pcommon.Timestamp) metricBuilderOption { 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), - resourceAttributeIncludeFilter: make(map[string]filter.Filter), - resourceAttributeExcludeFilter: make(map[string]filter.Filter), + config: mbc, + startTime: pcommon.NewTimestampFromTime(time.Now()), + metricsBuffer: pmetric.NewMetrics(), + buildInfo: settings.BuildInfo, + metricNginxHTTPConnections: newMetricNginxHTTPConnections(mbc.Metrics.NginxHTTPConnections), + metricNginxHTTPConnectionsCount: newMetricNginxHTTPConnectionsCount(mbc.Metrics.NginxHTTPConnectionsCount), + metricNginxHTTPRequests: newMetricNginxHTTPRequests(mbc.Metrics.NginxHTTPRequests), + metricNginxHTTPResponseStatus: newMetricNginxHTTPResponseStatus(mbc.Metrics.NginxHTTPResponseStatus), + resourceAttributeIncludeFilter: make(map[string]filter.Filter), + resourceAttributeExcludeFilter: make(map[string]filter.Filter), } if mbc.ResourceAttributes.InstanceID.MetricsInclude != nil { mb.resourceAttributeIncludeFilter["instance.id"] = filter.CreateFilter(mbc.ResourceAttributes.InstanceID.MetricsInclude) @@ -412,8 +412,8 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { 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.metricNginxHTTPConnections.emit(ils.Metrics()) + mb.metricNginxHTTPConnectionsCount.emit(ils.Metrics()) mb.metricNginxHTTPRequests.emit(ils.Metrics()) mb.metricNginxHTTPResponseStatus.emit(ils.Metrics()) @@ -447,14 +447,14 @@ func (mb *MetricsBuilder) Emit(rmo ...ResourceMetricsOption) pmetric.Metrics { 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()) +// RecordNginxHTTPConnectionsDataPoint adds a data point to nginx.http.connections metric. +func (mb *MetricsBuilder) RecordNginxHTTPConnectionsDataPoint(ts pcommon.Timestamp, val int64, nginxConnectionsOutcomeAttributeValue AttributeNginxConnectionsOutcome) { + mb.metricNginxHTTPConnections.recordDataPoint(mb.startTime, ts, val, nginxConnectionsOutcomeAttributeValue.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()) +// RecordNginxHTTPConnectionsCountDataPoint adds a data point to nginx.http.connections.count metric. +func (mb *MetricsBuilder) RecordNginxHTTPConnectionsCountDataPoint(ts pcommon.Timestamp, val int64, nginxConnectionsOutcomeAttributeValue AttributeNginxConnectionsOutcome) { + mb.metricNginxHTTPConnectionsCount.recordDataPoint(mb.startTime, ts, val, nginxConnectionsOutcomeAttributeValue.String()) } // RecordNginxHTTPRequestsDataPoint adds a data point to nginx.http.requests metric. diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go index ee4f069719..d32b9fddf4 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go @@ -70,11 +70,11 @@ func TestMetricsBuilder(t *testing.T) { defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxHTTPConnDataPoint(ts, 1, AttributeNginxConnOutcomeACCEPTED) + mb.RecordNginxHTTPConnectionsDataPoint(ts, 1, AttributeNginxConnectionsOutcomeACCEPTED) defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxHTTPConnCountDataPoint(ts, 1, AttributeNginxConnOutcomeACCEPTED) + mb.RecordNginxHTTPConnectionsCountDataPoint(ts, 1, AttributeNginxConnectionsOutcomeACCEPTED) defaultMetricsCount++ allMetricsCount++ @@ -109,9 +109,9 @@ func TestMetricsBuilder(t *testing.T) { 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 + case "nginx.http.connections": + assert.False(t, validatedMetrics["nginx.http.connections"], "Found a duplicate in the metrics slice: nginx.http.connections") + validatedMetrics["nginx.http.connections"] = 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()) @@ -123,12 +123,12 @@ func TestMetricsBuilder(t *testing.T) { 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") + attrVal, ok := dp.Attributes().Get("nginx.connections.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 + case "nginx.http.connections.count": + assert.False(t, validatedMetrics["nginx.http.connections.count"], "Found a duplicate in the metrics slice: nginx.http.connections.count") + validatedMetrics["nginx.http.connections.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()) @@ -138,7 +138,7 @@ func TestMetricsBuilder(t *testing.T) { 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") + attrVal, ok := dp.Attributes().Get("nginx.connections.outcome") assert.True(t, ok) assert.EqualValues(t, "ACCEPTED", attrVal.Str()) case "nginx.http.requests": diff --git a/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml b/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml index 8829a931e8..40fddcc0c3 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml +++ b/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml @@ -1,9 +1,9 @@ default: all_set: metrics: - nginx.http.conn: + nginx.http.connections: enabled: true - nginx.http.conn.count: + nginx.http.connections.count: enabled: true nginx.http.requests: enabled: true @@ -16,9 +16,9 @@ all_set: enabled: true none_set: metrics: - nginx.http.conn: + nginx.http.connections: enabled: false - nginx.http.conn.count: + nginx.http.connections.count: enabled: false nginx.http.requests: enabled: false diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper.go b/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper.go index 790d44d7a8..42448b1931 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper.go +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper.go @@ -88,22 +88,23 @@ func NewScraper( 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{ + nls := &NginxLogScraper{ cfg: cfg, logger: logger, settings: settings, mb: mb, rb: rb, mut: sync.Mutex{}, - outChan: outChan, - pipe: stanzaPipeline, wg: &sync.WaitGroup{}, - }, nil + } + + var err error + nls.pipe, err = nls.initStanzaPipeline(operators, settings.Logger) + if err != nil { + return nil, fmt.Errorf("init stanza pipeline: %w", err) + } + + return nls, nil } func (nls *NginxLogScraper) ID() component.ID { @@ -208,10 +209,10 @@ func (nls *NginxLogScraper) Shutdown(_ context.Context) error { return nls.pipe.Stop() } -func initStanzaPipeline( +func (nls *NginxLogScraper) initStanzaPipeline( operators []operator.Config, logger *zap.Logger, -) (*pipeline.DirectedPipeline, <-chan []*entry.Entry, error) { +) (*pipeline.DirectedPipeline, error) { mp := otel.GetMeterProvider() if mp == nil { mp = metricSdk.NewMeterProvider() @@ -224,13 +225,19 @@ func initStanzaPipeline( MetricsLevel: configtelemetry.LevelNone, } - emitter := helper.NewLogEmitter(settings) + emitter := helper.NewLogEmitter(settings, nls.ConsumerCallback) pipe, err := pipeline.Config{ Operators: operators, DefaultOutput: emitter, }.Build(settings) - return pipe, emitter.OutChannel(), err + return pipe, err +} + +func (nls *NginxLogScraper) ConsumerCallback(_ context.Context, entries []*entry.Entry) { + nls.mut.Lock() + nls.entries = append(nls.entries, entries...) + nls.mut.Unlock() } func (nls *NginxLogScraper) runConsumer(ctx context.Context) { 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 index 0df6a3f900..c3b9321dc8 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/config.go +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/config.go @@ -41,9 +41,9 @@ func NewConfigWithID(operatorID string) *Config { // 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"` + AccessLogFormat string `mapstructure:"access_log_format"` + fileconsumer.Config `mapstructure:",squash"` } // Build will build a file input operator from the supplied configuration 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 index 532eb1b355..8aff384711 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/input.go +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/operator/input/file/input.go @@ -9,6 +9,8 @@ import ( "context" "fmt" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit" + "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/entry" @@ -36,17 +38,17 @@ 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 { +func (i *Input) emit(ctx context.Context, token emit.Token) error { + if len(token.Body) == 0 { return nil } - ent, err := i.NewEntry(i.toBody(token)) + ent, err := i.NewEntry(i.toBody(token.Body)) if err != nil { return fmt.Errorf("create entry: %w", err) } - for k, v := range attrs { + for k, v := range token.Attributes { if setError := ent.Set(entry.NewAttributeField(k), v); setError != nil { i.Logger().Error("Set attribute", zap.Error(setError)) } 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 index f72112e3d8..0672c4efce 100644 --- 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 @@ -9,6 +9,8 @@ import ( "context" "testing" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/emit" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer" "github.com/stretchr/testify/require" "go.uber.org/zap" @@ -37,10 +39,16 @@ func TestInput_emit(t *testing.T) { token := []byte(accessLogLine) - err := input.emit(context.Background(), token, map[string]any{"attribute1": "test"}) + err := input.emit(context.Background(), emit.Token{ + Body: token, + Attributes: map[string]any{"attribute1": "test"}, + }) require.NoError(t, err) // nil token check - err = input.emit(context.Background(), nil, map[string]any{"attribute1": "test"}) + err = input.emit(context.Background(), emit.Token{ + Body: nil, + Attributes: map[string]any{"attribute1": "test"}, + }) require.NoError(t, err) } diff --git a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper.go b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper.go index a097c95c6f..38779570b4 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper.go +++ b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper.go @@ -7,7 +7,9 @@ package stubstatus import ( "context" + "net" "net/http" + "strings" "time" "github.com/nginxinc/nginx-prometheus-exporter/client" @@ -55,10 +57,14 @@ 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.TelemetrySettings) - if err != nil { - return err +func (s *NginxStubStatusScraper) Start(_ context.Context, _ component.Host) error { + httpClient := http.DefaultClient + if strings.HasPrefix(s.cfg.APIDetails.Listen, "unix:") { + httpClient.Transport = &http.Transport{ + DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { + return net.Dial("unix", strings.TrimPrefix(s.cfg.APIDetails.Listen, "unix:")) + }, + } } s.httpClient = httpClient @@ -72,7 +78,7 @@ func (s *NginxStubStatusScraper) Shutdown(_ context.Context) error { 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) + s.client = client.NewNginxClient(s.httpClient, s.cfg.APIDetails.URL) } stats, err := s.client.GetStubStats() @@ -89,36 +95,36 @@ func (s *NginxStubStatusScraper) Scrape(context.Context) (pmetric.Metrics, error s.mb.RecordNginxHTTPRequestsDataPoint(now, stats.Requests) - s.mb.RecordNginxHTTPConnDataPoint( + s.mb.RecordNginxHTTPConnectionsDataPoint( now, stats.Connections.Accepted, - metadata.AttributeNginxConnOutcomeACCEPTED, + metadata.AttributeNginxConnectionsOutcomeACCEPTED, ) - s.mb.RecordNginxHTTPConnDataPoint( + s.mb.RecordNginxHTTPConnectionsDataPoint( now, stats.Connections.Handled, - metadata.AttributeNginxConnOutcomeHANDLED, + metadata.AttributeNginxConnectionsOutcomeHANDLED, ) - s.mb.RecordNginxHTTPConnCountDataPoint( + s.mb.RecordNginxHTTPConnectionsCountDataPoint( now, stats.Connections.Active, - metadata.AttributeNginxConnOutcomeACTIVE, + metadata.AttributeNginxConnectionsOutcomeACTIVE, ) - s.mb.RecordNginxHTTPConnCountDataPoint( + s.mb.RecordNginxHTTPConnectionsCountDataPoint( now, stats.Connections.Reading, - metadata.AttributeNginxConnOutcomeREADING, + metadata.AttributeNginxConnectionsOutcomeREADING, ) - s.mb.RecordNginxHTTPConnCountDataPoint( + s.mb.RecordNginxHTTPConnectionsCountDataPoint( now, stats.Connections.Writing, - metadata.AttributeNginxConnOutcomeWRITING, + metadata.AttributeNginxConnectionsOutcomeWRITING, ) - s.mb.RecordNginxHTTPConnCountDataPoint( + s.mb.RecordNginxHTTPConnectionsCountDataPoint( now, stats.Connections.Waiting, - metadata.AttributeNginxConnOutcomeWAITING, + metadata.AttributeNginxConnectionsOutcomeWAITING, ) return s.mb.Emit(metadata.WithResource(s.rb.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 index 6c34c86092..9afff68c33 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper_test.go +++ b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper_test.go @@ -18,8 +18,6 @@ import ( "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" @@ -33,7 +31,7 @@ func TestStubStatusScraper(t *testing.T) { defer nginxMock.Close() cfg, ok := config.CreateDefaultConfig().(*config.Config) assert.True(t, ok) - cfg.Endpoint = nginxMock.URL + "/status" + cfg.APIDetails.URL = nginxMock.URL + "/status" require.NoError(t, component.ValidateConfig(cfg)) stubStatusScraper := NewScraper(receivertest.NewNopSettings(), cfg) @@ -68,8 +66,10 @@ func TestStubStatusScraperError(t *testing.T) { })) t.Run("404", func(t *testing.T) { sc := NewScraper(receivertest.NewNopSettings(), &config.Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: nginxMock.URL + "/badpath", + APIDetails: config.APIDetails{ + URL: nginxMock.URL + "/badpath", + Listen: "", + Location: "", }, }) err := sc.Start(context.Background(), componenttest.NewNopHost()) @@ -80,8 +80,10 @@ func TestStubStatusScraperError(t *testing.T) { t.Run("parse error", func(t *testing.T) { sc := NewScraper(receivertest.NewNopSettings(), &config.Config{ - ClientConfig: confighttp.ClientConfig{ - Endpoint: nginxMock.URL + "/status", + APIDetails: config.APIDetails{ + URL: nginxMock.URL + "/status", + Listen: "", + Location: "", }, }) err := sc.Start(context.Background(), componenttest.NewNopHost()) @@ -92,21 +94,6 @@ func TestStubStatusScraperError(t *testing.T) { 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) { diff --git a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml index 5d1cd6d165..ef46a6ccdc 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml +++ b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml @@ -7,45 +7,45 @@ resourceMetrics: scopeMetrics: - metrics: - description: The total number of connections. - name: nginx.http.conn + name: nginx.http.connections sum: aggregationTemporality: 2 dataPoints: - asInt: "16630948" attributes: - - key: nginx.conn.outcome + - key: nginx.connections.outcome value: stringValue: ACCEPTED - asInt: "16630946" attributes: - - key: nginx.conn.outcome + - key: nginx.connections.outcome value: stringValue: HANDLED isMonotonic: true unit: connections - description: The current number of connections. - name: nginx.http.conn.count + name: nginx.http.connections.count gauge: aggregationTemporality: 2 dataPoints: - asInt: "291" attributes: - - key: nginx.conn.outcome + - key: nginx.connections.outcome value: stringValue: ACTIVE - asInt: "6" attributes: - - key: nginx.conn.outcome + - key: nginx.connections.outcome value: stringValue: READING - asInt: "179" attributes: - - key: nginx.conn.outcome + - key: nginx.connections.outcome value: stringValue: WRITING - asInt: "106" attributes: - - key: nginx.conn.outcome + - key: nginx.connections.outcome value: stringValue: WAITING isMonotonic: true diff --git a/internal/collector/nginxossreceiver/metadata.yaml b/internal/collector/nginxossreceiver/metadata.yaml index ff49eab4cd..4a4d70bfc4 100644 --- a/internal/collector/nginxossreceiver/metadata.yaml +++ b/internal/collector/nginxossreceiver/metadata.yaml @@ -20,7 +20,7 @@ resource_attributes: enabled: true attributes: - nginx.conn.outcome: + nginx.connections.outcome: description: The outcome of the connection. type: string enum: @@ -49,7 +49,7 @@ metrics: monotonic: true aggregation_temporality: cumulative unit: "requests" - nginx.http.conn: + nginx.http.connections: enabled: true description: The total number of connections. sum: @@ -58,15 +58,15 @@ metrics: aggregation_temporality: cumulative unit: "connections" attributes: - - nginx.conn.outcome - nginx.http.conn.count: + - nginx.connections.outcome + nginx.http.connections.count: enabled: true description: The current number of connections. gauge: value_type: int unit: "connections" attributes: - - nginx.conn.outcome + - nginx.connections.outcome nginx.http.response.status: enabled: true description: The number of responses, grouped by status code range. diff --git a/internal/collector/nginxplusreceiver/README.md b/internal/collector/nginxplusreceiver/README.md index 615844fce8..a3f222c0db 100644 --- a/internal/collector/nginxplusreceiver/README.md +++ b/internal/collector/nginxplusreceiver/README.md @@ -13,7 +13,12 @@ Please see [ngx_http_api_module](https://nginx.org/en/docs/http/ngx_http_api_mod The following settings are required: -- `endpoint` (default: `http://localhost:80/api`): The URL of the NGINX Plus API endpoint + +The following settings are required: +- `api_details`: Details for the NGINX Plus API endpoint. + - `url`: (default: `http://localhost:80/api`): The URL of the NGINX Plus API endpoint. + - `listen`: (default: `localhost:80`): The listen directive of the NGINX Plus API endpoint. + - `location`: (default: `/api`): The location directive of the NGINX Plus API endpoint. The following settings are optional: @@ -26,6 +31,9 @@ Example: ```yaml receivers: nginxplus: - endpoint: "http://localhost:80/api" + api_details: + url: "http://localhost:80/api" + listen: "localhost:80" + location: "/api" collection_interval: 10s ``` diff --git a/internal/collector/nginxplusreceiver/config.go b/internal/collector/nginxplusreceiver/config.go index 2297f5534e..ece51812a0 100644 --- a/internal/collector/nginxplusreceiver/config.go +++ b/internal/collector/nginxplusreceiver/config.go @@ -8,6 +8,8 @@ import ( "errors" "time" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/receiver/scraperhelper" @@ -18,13 +20,20 @@ const defaultCollectInterval = 10 * time.Second type Config struct { confighttp.ClientConfig `mapstructure:",squash"` + APIDetails APIDetails `mapstructure:"api_details"` MetricsBuilderConfig metadata.MetricsBuilderConfig `mapstructure:",squash"` scraperhelper.ControllerConfig `mapstructure:",squash"` } +type APIDetails struct { + URL string `mapstructure:"url"` + Listen string `mapstructure:"listen"` + Location string `mapstructure:"location"` +} + // Validate checks if the receiver configuration is valid func (cfg *Config) Validate() error { - if cfg.Endpoint == "" { + if cfg.APIDetails.URL == "" { return errors.New("endpoint cannot be empty for nginxplusreceiver") } @@ -34,3 +43,22 @@ func (cfg *Config) Validate() error { return nil } + +// nolint: ireturn +func createDefaultConfig() component.Config { + cfg := scraperhelper.NewDefaultControllerConfig() + cfg.CollectionInterval = defaultCollectInterval + + return &Config{ + ControllerConfig: cfg, + ClientConfig: confighttp.ClientConfig{ + Timeout: defaultTimeout, + }, + APIDetails: APIDetails{ + URL: "http://localhost:80/api", + Listen: "localhost:80", + Location: "/api", + }, + MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(), + } +} diff --git a/internal/collector/nginxplusreceiver/documentation.md b/internal/collector/nginxplusreceiver/documentation.md index 7dce5a8621..f60bde97f0 100644 --- a/internal/collector/nginxplusreceiver/documentation.md +++ b/internal/collector/nginxplusreceiver/documentation.md @@ -78,7 +78,7 @@ The total number of NGINX config reloads. | ---- | ----------- | ---------- | ----------------------- | --------- | | reloads | Sum | Int | Cumulative | true | -### nginx.http.conn +### nginx.http.connections The total number of connections. @@ -90,9 +90,9 @@ The total number of connections. | Name | Description | Values | | ---- | ----------- | ------ | -| nginx.conn.outcome | The outcome of the connection. | Str: ``ACCEPTED``, ``ACTIVE``, ``DROPPED``, ``IDLE`` | +| nginx.connections.outcome | The outcome of the connection. | Str: ``ACCEPTED``, ``ACTIVE``, ``DROPPED``, ``IDLE`` | -### nginx.http.conn.count +### nginx.http.connections.count The current number of connections. @@ -104,7 +104,7 @@ The current number of connections. | Name | Description | Values | | ---- | ----------- | ------ | -| nginx.conn.outcome | The outcome of the connection. | Str: ``ACCEPTED``, ``ACTIVE``, ``DROPPED``, ``IDLE`` | +| nginx.connections.outcome | The outcome of the connection. | Str: ``ACCEPTED``, ``ACTIVE``, ``DROPPED``, ``IDLE`` | ### nginx.http.limit_conn.requests @@ -269,7 +269,7 @@ The total number of byte IO per HTTP upstream peer. | nginx.peer.address | The address of the peer. | Any Str | | nginx.peer.name | The name of the peer. | Any Str | -### nginx.http.upstream.peer.conn.count +### nginx.http.upstream.peer.connections.count The average number of active connections per HTTP upstream peer. @@ -647,7 +647,7 @@ The total number of Stream byte IO. | nginx.byte.io.direction | The direction of byte traffic. | Str: ``RX``, ``TX`` | | nginx.zone.name | The name of the shared memory zone. | Any Str | -### nginx.stream.connection.accepted +### nginx.stream.connections.accepted The total number of connections accepted from clients. @@ -661,7 +661,7 @@ The total number of connections accepted from clients. | ---- | ----------- | ------ | | nginx.zone.name | The name of the shared memory zone. | Any Str | -### nginx.stream.connection.discarded +### nginx.stream.connections.discarded Total number of connections completed without creating a session. @@ -675,7 +675,7 @@ Total number of connections completed without creating a session. | ---- | ----------- | ------ | | nginx.zone.name | The name of the shared memory zone. | Any Str | -### nginx.stream.connection.processing.count +### nginx.stream.connections.processing.count The number of client connections that are currently being processed. @@ -722,13 +722,13 @@ The total number of Stream Upstream Peer byte IO. | nginx.peer.address | The address of the peer. | Any Str | | nginx.peer.name | The name of the peer. | Any Str | -### nginx.stream.upstream.peer.conn.count +### nginx.stream.upstream.peer.connections -The current number of Stream Upstream Peer connections. +The total number of client connections forwarded to this stream upstream peer. -| Unit | Metric Type | Value Type | -| ---- | ----------- | ---------- | -| connections | Gauge | Int | +| Unit | Metric Type | Value Type | Aggregation Temporality | Monotonic | +| ---- | ----------- | ---------- | ----------------------- | --------- | +| connections | Sum | Int | Cumulative | true | #### Attributes @@ -739,13 +739,13 @@ The current number of Stream Upstream Peer connections. | nginx.peer.address | The address of the peer. | Any Str | | nginx.peer.name | The name of the peer. | Any Str | -### nginx.stream.upstream.peer.conn.time +### nginx.stream.upstream.peer.connections.count -The average time to connect to the stream upstream peer. +The current number of Stream Upstream Peer connections. | Unit | Metric Type | Value Type | | ---- | ----------- | ---------- | -| ms | Gauge | Int | +| connections | Gauge | Int | #### Attributes @@ -756,13 +756,13 @@ The average time to connect to the stream upstream peer. | nginx.peer.address | The address of the peer. | Any Str | | nginx.peer.name | The name of the peer. | Any Str | -### nginx.stream.upstream.peer.conns +### nginx.stream.upstream.peer.connections.time -The total number of client connections forwarded to this stream upstream peer. +The average time to connect to the stream upstream peer. -| Unit | Metric Type | Value Type | Aggregation Temporality | Monotonic | -| ---- | ----------- | ---------- | ----------------------- | --------- | -| connections | Sum | Int | Cumulative | true | +| Unit | Metric Type | Value Type | +| ---- | ----------- | ---------- | +| ms | Gauge | Int | #### Attributes diff --git a/internal/collector/nginxplusreceiver/factory.go b/internal/collector/nginxplusreceiver/factory.go index 3ae579b56d..0e5157e430 100644 --- a/internal/collector/nginxplusreceiver/factory.go +++ b/internal/collector/nginxplusreceiver/factory.go @@ -11,7 +11,6 @@ import ( "time" "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/receiver" "go.opentelemetry.io/collector/receiver/scraperhelper" @@ -29,21 +28,6 @@ func NewFactory() receiver.Factory { receiver.WithMetrics(createMetricsReceiver, metadata.MetricsStability)) } -// nolint: ireturn -func createDefaultConfig() component.Config { - cfg := scraperhelper.NewDefaultControllerConfig() - cfg.CollectionInterval = defaultCollectInterval - - return &Config{ - ControllerConfig: cfg, - ClientConfig: confighttp.ClientConfig{ - Endpoint: "http://localhost:80/api", - Timeout: defaultTimeout, - }, - MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(), - } -} - // nolint: ireturn func createMetricsReceiver( ctx context.Context, @@ -65,8 +49,7 @@ func createMetricsReceiver( return nil, fmt.Errorf("new nginx plus scraper: %w", err) } - scraper, err := scraperhelper.NewScraper( - metadata.Type.String(), + scraper, err := scraperhelper.NewScraperWithoutType( nps.scrape, scraperhelper.WithShutdown(nps.Shutdown), ) @@ -76,6 +59,6 @@ func createMetricsReceiver( return scraperhelper.NewScraperControllerReceiver( &cfg.ControllerConfig, params, metricsConsumer, - scraperhelper.AddScraper(scraper), + scraperhelper.AddScraperWithType(metadata.Type, scraper), ) } diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_config.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_config.go index 2059f6cd64..556c5f6d0d 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_config.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_config.go @@ -28,64 +28,64 @@ func (ms *MetricConfig) Unmarshal(parser *confmap.Conf) error { // MetricsConfig provides config for nginxplus metrics. type MetricsConfig struct { - NginxCacheBytes MetricConfig `mapstructure:"nginx.cache.bytes"` - NginxCacheMemoryLimit MetricConfig `mapstructure:"nginx.cache.memory.limit"` - NginxCacheMemoryUsage MetricConfig `mapstructure:"nginx.cache.memory.usage"` - NginxCacheResponses MetricConfig `mapstructure:"nginx.cache.responses"` - NginxConfigReloads MetricConfig `mapstructure:"nginx.config.reloads"` - NginxHTTPConn MetricConfig `mapstructure:"nginx.http.conn"` - NginxHTTPConnCount MetricConfig `mapstructure:"nginx.http.conn.count"` - NginxHTTPLimitConnRequests MetricConfig `mapstructure:"nginx.http.limit_conn.requests"` - NginxHTTPLimitReqRequests MetricConfig `mapstructure:"nginx.http.limit_req.requests"` - NginxHTTPRequestByteIo MetricConfig `mapstructure:"nginx.http.request.byte.io"` - NginxHTTPRequestDiscarded MetricConfig `mapstructure:"nginx.http.request.discarded"` - NginxHTTPRequestProcessingCount MetricConfig `mapstructure:"nginx.http.request.processing.count"` - NginxHTTPRequests MetricConfig `mapstructure:"nginx.http.requests"` - NginxHTTPRequestsCount MetricConfig `mapstructure:"nginx.http.requests.count"` - NginxHTTPResponseStatus MetricConfig `mapstructure:"nginx.http.response.status"` - NginxHTTPResponses MetricConfig `mapstructure:"nginx.http.responses"` - NginxHTTPUpstreamKeepaliveCount MetricConfig `mapstructure:"nginx.http.upstream.keepalive.count"` - NginxHTTPUpstreamPeerByteIo MetricConfig `mapstructure:"nginx.http.upstream.peer.byte.io"` - NginxHTTPUpstreamPeerConnCount MetricConfig `mapstructure:"nginx.http.upstream.peer.conn.count"` - NginxHTTPUpstreamPeerCount MetricConfig `mapstructure:"nginx.http.upstream.peer.count"` - NginxHTTPUpstreamPeerFails MetricConfig `mapstructure:"nginx.http.upstream.peer.fails"` - NginxHTTPUpstreamPeerHeaderTime MetricConfig `mapstructure:"nginx.http.upstream.peer.header.time"` - NginxHTTPUpstreamPeerHealthChecks MetricConfig `mapstructure:"nginx.http.upstream.peer.health_checks"` - NginxHTTPUpstreamPeerRequests MetricConfig `mapstructure:"nginx.http.upstream.peer.requests"` - NginxHTTPUpstreamPeerResponseTime MetricConfig `mapstructure:"nginx.http.upstream.peer.response.time"` - NginxHTTPUpstreamPeerResponses MetricConfig `mapstructure:"nginx.http.upstream.peer.responses"` - NginxHTTPUpstreamPeerState MetricConfig `mapstructure:"nginx.http.upstream.peer.state"` - NginxHTTPUpstreamPeerUnavailables MetricConfig `mapstructure:"nginx.http.upstream.peer.unavailables"` - NginxHTTPUpstreamQueueLimit MetricConfig `mapstructure:"nginx.http.upstream.queue.limit"` - NginxHTTPUpstreamQueueOverflows MetricConfig `mapstructure:"nginx.http.upstream.queue.overflows"` - NginxHTTPUpstreamQueueUsage MetricConfig `mapstructure:"nginx.http.upstream.queue.usage"` - NginxHTTPUpstreamZombieCount MetricConfig `mapstructure:"nginx.http.upstream.zombie.count"` - NginxSlabPageFree MetricConfig `mapstructure:"nginx.slab.page.free"` - NginxSlabPageLimit MetricConfig `mapstructure:"nginx.slab.page.limit"` - NginxSlabPageUsage MetricConfig `mapstructure:"nginx.slab.page.usage"` - NginxSlabPageUtilization MetricConfig `mapstructure:"nginx.slab.page.utilization"` - NginxSlabSlotAllocations MetricConfig `mapstructure:"nginx.slab.slot.allocations"` - NginxSlabSlotFree MetricConfig `mapstructure:"nginx.slab.slot.free"` - NginxSlabSlotUsage MetricConfig `mapstructure:"nginx.slab.slot.usage"` - NginxSslCertificateVerifyFailures MetricConfig `mapstructure:"nginx.ssl.certificate.verify_failures"` - NginxSslHandshakes MetricConfig `mapstructure:"nginx.ssl.handshakes"` - NginxStreamByteIo MetricConfig `mapstructure:"nginx.stream.byte.io"` - NginxStreamConnectionAccepted MetricConfig `mapstructure:"nginx.stream.connection.accepted"` - NginxStreamConnectionDiscarded MetricConfig `mapstructure:"nginx.stream.connection.discarded"` - NginxStreamConnectionProcessingCount MetricConfig `mapstructure:"nginx.stream.connection.processing.count"` - NginxStreamSessionStatus MetricConfig `mapstructure:"nginx.stream.session.status"` - NginxStreamUpstreamPeerByteIo MetricConfig `mapstructure:"nginx.stream.upstream.peer.byte.io"` - NginxStreamUpstreamPeerConnCount MetricConfig `mapstructure:"nginx.stream.upstream.peer.conn.count"` - NginxStreamUpstreamPeerConnTime MetricConfig `mapstructure:"nginx.stream.upstream.peer.conn.time"` - NginxStreamUpstreamPeerConns MetricConfig `mapstructure:"nginx.stream.upstream.peer.conns"` - NginxStreamUpstreamPeerCount MetricConfig `mapstructure:"nginx.stream.upstream.peer.count"` - NginxStreamUpstreamPeerFails MetricConfig `mapstructure:"nginx.stream.upstream.peer.fails"` - NginxStreamUpstreamPeerHealthChecks MetricConfig `mapstructure:"nginx.stream.upstream.peer.health_checks"` - NginxStreamUpstreamPeerResponseTime MetricConfig `mapstructure:"nginx.stream.upstream.peer.response.time"` - NginxStreamUpstreamPeerState MetricConfig `mapstructure:"nginx.stream.upstream.peer.state"` - NginxStreamUpstreamPeerTtfbTime MetricConfig `mapstructure:"nginx.stream.upstream.peer.ttfb.time"` - NginxStreamUpstreamPeerUnavailable MetricConfig `mapstructure:"nginx.stream.upstream.peer.unavailable"` - NginxStreamUpstreamZombieCount MetricConfig `mapstructure:"nginx.stream.upstream.zombie.count"` + NginxCacheBytes MetricConfig `mapstructure:"nginx.cache.bytes"` + NginxCacheMemoryLimit MetricConfig `mapstructure:"nginx.cache.memory.limit"` + NginxCacheMemoryUsage MetricConfig `mapstructure:"nginx.cache.memory.usage"` + NginxCacheResponses MetricConfig `mapstructure:"nginx.cache.responses"` + NginxConfigReloads MetricConfig `mapstructure:"nginx.config.reloads"` + NginxHTTPConnections MetricConfig `mapstructure:"nginx.http.connections"` + NginxHTTPConnectionsCount MetricConfig `mapstructure:"nginx.http.connections.count"` + NginxHTTPLimitConnRequests MetricConfig `mapstructure:"nginx.http.limit_conn.requests"` + NginxHTTPLimitReqRequests MetricConfig `mapstructure:"nginx.http.limit_req.requests"` + NginxHTTPRequestByteIo MetricConfig `mapstructure:"nginx.http.request.byte.io"` + NginxHTTPRequestDiscarded MetricConfig `mapstructure:"nginx.http.request.discarded"` + NginxHTTPRequestProcessingCount MetricConfig `mapstructure:"nginx.http.request.processing.count"` + NginxHTTPRequests MetricConfig `mapstructure:"nginx.http.requests"` + NginxHTTPRequestsCount MetricConfig `mapstructure:"nginx.http.requests.count"` + NginxHTTPResponseStatus MetricConfig `mapstructure:"nginx.http.response.status"` + NginxHTTPResponses MetricConfig `mapstructure:"nginx.http.responses"` + NginxHTTPUpstreamKeepaliveCount MetricConfig `mapstructure:"nginx.http.upstream.keepalive.count"` + NginxHTTPUpstreamPeerByteIo MetricConfig `mapstructure:"nginx.http.upstream.peer.byte.io"` + NginxHTTPUpstreamPeerConnectionsCount MetricConfig `mapstructure:"nginx.http.upstream.peer.connections.count"` + NginxHTTPUpstreamPeerCount MetricConfig `mapstructure:"nginx.http.upstream.peer.count"` + NginxHTTPUpstreamPeerFails MetricConfig `mapstructure:"nginx.http.upstream.peer.fails"` + NginxHTTPUpstreamPeerHeaderTime MetricConfig `mapstructure:"nginx.http.upstream.peer.header.time"` + NginxHTTPUpstreamPeerHealthChecks MetricConfig `mapstructure:"nginx.http.upstream.peer.health_checks"` + NginxHTTPUpstreamPeerRequests MetricConfig `mapstructure:"nginx.http.upstream.peer.requests"` + NginxHTTPUpstreamPeerResponseTime MetricConfig `mapstructure:"nginx.http.upstream.peer.response.time"` + NginxHTTPUpstreamPeerResponses MetricConfig `mapstructure:"nginx.http.upstream.peer.responses"` + NginxHTTPUpstreamPeerState MetricConfig `mapstructure:"nginx.http.upstream.peer.state"` + NginxHTTPUpstreamPeerUnavailables MetricConfig `mapstructure:"nginx.http.upstream.peer.unavailables"` + NginxHTTPUpstreamQueueLimit MetricConfig `mapstructure:"nginx.http.upstream.queue.limit"` + NginxHTTPUpstreamQueueOverflows MetricConfig `mapstructure:"nginx.http.upstream.queue.overflows"` + NginxHTTPUpstreamQueueUsage MetricConfig `mapstructure:"nginx.http.upstream.queue.usage"` + NginxHTTPUpstreamZombieCount MetricConfig `mapstructure:"nginx.http.upstream.zombie.count"` + NginxSlabPageFree MetricConfig `mapstructure:"nginx.slab.page.free"` + NginxSlabPageLimit MetricConfig `mapstructure:"nginx.slab.page.limit"` + NginxSlabPageUsage MetricConfig `mapstructure:"nginx.slab.page.usage"` + NginxSlabPageUtilization MetricConfig `mapstructure:"nginx.slab.page.utilization"` + NginxSlabSlotAllocations MetricConfig `mapstructure:"nginx.slab.slot.allocations"` + NginxSlabSlotFree MetricConfig `mapstructure:"nginx.slab.slot.free"` + NginxSlabSlotUsage MetricConfig `mapstructure:"nginx.slab.slot.usage"` + NginxSslCertificateVerifyFailures MetricConfig `mapstructure:"nginx.ssl.certificate.verify_failures"` + NginxSslHandshakes MetricConfig `mapstructure:"nginx.ssl.handshakes"` + NginxStreamByteIo MetricConfig `mapstructure:"nginx.stream.byte.io"` + NginxStreamConnectionsAccepted MetricConfig `mapstructure:"nginx.stream.connections.accepted"` + NginxStreamConnectionsDiscarded MetricConfig `mapstructure:"nginx.stream.connections.discarded"` + NginxStreamConnectionsProcessingCount MetricConfig `mapstructure:"nginx.stream.connections.processing.count"` + NginxStreamSessionStatus MetricConfig `mapstructure:"nginx.stream.session.status"` + NginxStreamUpstreamPeerByteIo MetricConfig `mapstructure:"nginx.stream.upstream.peer.byte.io"` + NginxStreamUpstreamPeerConnections MetricConfig `mapstructure:"nginx.stream.upstream.peer.connections"` + NginxStreamUpstreamPeerConnectionsCount MetricConfig `mapstructure:"nginx.stream.upstream.peer.connections.count"` + NginxStreamUpstreamPeerConnectionsTime MetricConfig `mapstructure:"nginx.stream.upstream.peer.connections.time"` + NginxStreamUpstreamPeerCount MetricConfig `mapstructure:"nginx.stream.upstream.peer.count"` + NginxStreamUpstreamPeerFails MetricConfig `mapstructure:"nginx.stream.upstream.peer.fails"` + NginxStreamUpstreamPeerHealthChecks MetricConfig `mapstructure:"nginx.stream.upstream.peer.health_checks"` + NginxStreamUpstreamPeerResponseTime MetricConfig `mapstructure:"nginx.stream.upstream.peer.response.time"` + NginxStreamUpstreamPeerState MetricConfig `mapstructure:"nginx.stream.upstream.peer.state"` + NginxStreamUpstreamPeerTtfbTime MetricConfig `mapstructure:"nginx.stream.upstream.peer.ttfb.time"` + NginxStreamUpstreamPeerUnavailable MetricConfig `mapstructure:"nginx.stream.upstream.peer.unavailable"` + NginxStreamUpstreamZombieCount MetricConfig `mapstructure:"nginx.stream.upstream.zombie.count"` } func DefaultMetricsConfig() MetricsConfig { @@ -105,10 +105,10 @@ func DefaultMetricsConfig() MetricsConfig { NginxConfigReloads: MetricConfig{ Enabled: true, }, - NginxHTTPConn: MetricConfig{ + NginxHTTPConnections: MetricConfig{ Enabled: true, }, - NginxHTTPConnCount: MetricConfig{ + NginxHTTPConnectionsCount: MetricConfig{ Enabled: true, }, NginxHTTPLimitConnRequests: MetricConfig{ @@ -144,7 +144,7 @@ func DefaultMetricsConfig() MetricsConfig { NginxHTTPUpstreamPeerByteIo: MetricConfig{ Enabled: true, }, - NginxHTTPUpstreamPeerConnCount: MetricConfig{ + NginxHTTPUpstreamPeerConnectionsCount: MetricConfig{ Enabled: true, }, NginxHTTPUpstreamPeerCount: MetricConfig{ @@ -216,13 +216,13 @@ func DefaultMetricsConfig() MetricsConfig { NginxStreamByteIo: MetricConfig{ Enabled: true, }, - NginxStreamConnectionAccepted: MetricConfig{ + NginxStreamConnectionsAccepted: MetricConfig{ Enabled: true, }, - NginxStreamConnectionDiscarded: MetricConfig{ + NginxStreamConnectionsDiscarded: MetricConfig{ Enabled: true, }, - NginxStreamConnectionProcessingCount: MetricConfig{ + NginxStreamConnectionsProcessingCount: MetricConfig{ Enabled: true, }, NginxStreamSessionStatus: MetricConfig{ @@ -231,13 +231,13 @@ func DefaultMetricsConfig() MetricsConfig { NginxStreamUpstreamPeerByteIo: MetricConfig{ Enabled: true, }, - NginxStreamUpstreamPeerConnCount: MetricConfig{ + NginxStreamUpstreamPeerConnections: MetricConfig{ Enabled: true, }, - NginxStreamUpstreamPeerConnTime: MetricConfig{ + NginxStreamUpstreamPeerConnectionsCount: MetricConfig{ Enabled: true, }, - NginxStreamUpstreamPeerConns: MetricConfig{ + NginxStreamUpstreamPeerConnectionsTime: MetricConfig{ Enabled: true, }, NginxStreamUpstreamPeerCount: MetricConfig{ diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_config_test.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_config_test.go index 4f4503192c..013974c454 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_config_test.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_config_test.go @@ -25,64 +25,64 @@ func TestMetricsBuilderConfig(t *testing.T) { name: "all_set", want: MetricsBuilderConfig{ Metrics: MetricsConfig{ - NginxCacheBytes: MetricConfig{Enabled: true}, - NginxCacheMemoryLimit: MetricConfig{Enabled: true}, - NginxCacheMemoryUsage: MetricConfig{Enabled: true}, - NginxCacheResponses: MetricConfig{Enabled: true}, - NginxConfigReloads: MetricConfig{Enabled: true}, - NginxHTTPConn: MetricConfig{Enabled: true}, - NginxHTTPConnCount: MetricConfig{Enabled: true}, - NginxHTTPLimitConnRequests: MetricConfig{Enabled: true}, - NginxHTTPLimitReqRequests: MetricConfig{Enabled: true}, - NginxHTTPRequestByteIo: MetricConfig{Enabled: true}, - NginxHTTPRequestDiscarded: MetricConfig{Enabled: true}, - NginxHTTPRequestProcessingCount: MetricConfig{Enabled: true}, - NginxHTTPRequests: MetricConfig{Enabled: true}, - NginxHTTPRequestsCount: MetricConfig{Enabled: true}, - NginxHTTPResponseStatus: MetricConfig{Enabled: true}, - NginxHTTPResponses: MetricConfig{Enabled: true}, - NginxHTTPUpstreamKeepaliveCount: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerByteIo: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerConnCount: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerCount: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerFails: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerHeaderTime: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerHealthChecks: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerRequests: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerResponseTime: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerResponses: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerState: MetricConfig{Enabled: true}, - NginxHTTPUpstreamPeerUnavailables: MetricConfig{Enabled: true}, - NginxHTTPUpstreamQueueLimit: MetricConfig{Enabled: true}, - NginxHTTPUpstreamQueueOverflows: MetricConfig{Enabled: true}, - NginxHTTPUpstreamQueueUsage: MetricConfig{Enabled: true}, - NginxHTTPUpstreamZombieCount: MetricConfig{Enabled: true}, - NginxSlabPageFree: MetricConfig{Enabled: true}, - NginxSlabPageLimit: MetricConfig{Enabled: true}, - NginxSlabPageUsage: MetricConfig{Enabled: true}, - NginxSlabPageUtilization: MetricConfig{Enabled: true}, - NginxSlabSlotAllocations: MetricConfig{Enabled: true}, - NginxSlabSlotFree: MetricConfig{Enabled: true}, - NginxSlabSlotUsage: MetricConfig{Enabled: true}, - NginxSslCertificateVerifyFailures: MetricConfig{Enabled: true}, - NginxSslHandshakes: MetricConfig{Enabled: true}, - NginxStreamByteIo: MetricConfig{Enabled: true}, - NginxStreamConnectionAccepted: MetricConfig{Enabled: true}, - NginxStreamConnectionDiscarded: MetricConfig{Enabled: true}, - NginxStreamConnectionProcessingCount: MetricConfig{Enabled: true}, - NginxStreamSessionStatus: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerByteIo: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerConnCount: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerConnTime: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerConns: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerCount: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerFails: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerHealthChecks: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerResponseTime: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerState: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerTtfbTime: MetricConfig{Enabled: true}, - NginxStreamUpstreamPeerUnavailable: MetricConfig{Enabled: true}, - NginxStreamUpstreamZombieCount: MetricConfig{Enabled: true}, + NginxCacheBytes: MetricConfig{Enabled: true}, + NginxCacheMemoryLimit: MetricConfig{Enabled: true}, + NginxCacheMemoryUsage: MetricConfig{Enabled: true}, + NginxCacheResponses: MetricConfig{Enabled: true}, + NginxConfigReloads: MetricConfig{Enabled: true}, + NginxHTTPConnections: MetricConfig{Enabled: true}, + NginxHTTPConnectionsCount: MetricConfig{Enabled: true}, + NginxHTTPLimitConnRequests: MetricConfig{Enabled: true}, + NginxHTTPLimitReqRequests: MetricConfig{Enabled: true}, + NginxHTTPRequestByteIo: MetricConfig{Enabled: true}, + NginxHTTPRequestDiscarded: MetricConfig{Enabled: true}, + NginxHTTPRequestProcessingCount: MetricConfig{Enabled: true}, + NginxHTTPRequests: MetricConfig{Enabled: true}, + NginxHTTPRequestsCount: MetricConfig{Enabled: true}, + NginxHTTPResponseStatus: MetricConfig{Enabled: true}, + NginxHTTPResponses: MetricConfig{Enabled: true}, + NginxHTTPUpstreamKeepaliveCount: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerByteIo: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerConnectionsCount: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerCount: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerFails: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerHeaderTime: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerHealthChecks: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerRequests: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerResponseTime: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerResponses: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerState: MetricConfig{Enabled: true}, + NginxHTTPUpstreamPeerUnavailables: MetricConfig{Enabled: true}, + NginxHTTPUpstreamQueueLimit: MetricConfig{Enabled: true}, + NginxHTTPUpstreamQueueOverflows: MetricConfig{Enabled: true}, + NginxHTTPUpstreamQueueUsage: MetricConfig{Enabled: true}, + NginxHTTPUpstreamZombieCount: MetricConfig{Enabled: true}, + NginxSlabPageFree: MetricConfig{Enabled: true}, + NginxSlabPageLimit: MetricConfig{Enabled: true}, + NginxSlabPageUsage: MetricConfig{Enabled: true}, + NginxSlabPageUtilization: MetricConfig{Enabled: true}, + NginxSlabSlotAllocations: MetricConfig{Enabled: true}, + NginxSlabSlotFree: MetricConfig{Enabled: true}, + NginxSlabSlotUsage: MetricConfig{Enabled: true}, + NginxSslCertificateVerifyFailures: MetricConfig{Enabled: true}, + NginxSslHandshakes: MetricConfig{Enabled: true}, + NginxStreamByteIo: MetricConfig{Enabled: true}, + NginxStreamConnectionsAccepted: MetricConfig{Enabled: true}, + NginxStreamConnectionsDiscarded: MetricConfig{Enabled: true}, + NginxStreamConnectionsProcessingCount: MetricConfig{Enabled: true}, + NginxStreamSessionStatus: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerByteIo: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerConnections: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerConnectionsCount: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerConnectionsTime: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerCount: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerFails: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerHealthChecks: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerResponseTime: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerState: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerTtfbTime: MetricConfig{Enabled: true}, + NginxStreamUpstreamPeerUnavailable: MetricConfig{Enabled: true}, + NginxStreamUpstreamZombieCount: MetricConfig{Enabled: true}, }, ResourceAttributes: ResourceAttributesConfig{ InstanceID: ResourceAttributeConfig{Enabled: true}, @@ -94,64 +94,64 @@ func TestMetricsBuilderConfig(t *testing.T) { name: "none_set", want: MetricsBuilderConfig{ Metrics: MetricsConfig{ - NginxCacheBytes: MetricConfig{Enabled: false}, - NginxCacheMemoryLimit: MetricConfig{Enabled: false}, - NginxCacheMemoryUsage: MetricConfig{Enabled: false}, - NginxCacheResponses: MetricConfig{Enabled: false}, - NginxConfigReloads: MetricConfig{Enabled: false}, - NginxHTTPConn: MetricConfig{Enabled: false}, - NginxHTTPConnCount: MetricConfig{Enabled: false}, - NginxHTTPLimitConnRequests: MetricConfig{Enabled: false}, - NginxHTTPLimitReqRequests: MetricConfig{Enabled: false}, - NginxHTTPRequestByteIo: MetricConfig{Enabled: false}, - NginxHTTPRequestDiscarded: MetricConfig{Enabled: false}, - NginxHTTPRequestProcessingCount: MetricConfig{Enabled: false}, - NginxHTTPRequests: MetricConfig{Enabled: false}, - NginxHTTPRequestsCount: MetricConfig{Enabled: false}, - NginxHTTPResponseStatus: MetricConfig{Enabled: false}, - NginxHTTPResponses: MetricConfig{Enabled: false}, - NginxHTTPUpstreamKeepaliveCount: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerByteIo: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerConnCount: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerCount: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerFails: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerHeaderTime: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerHealthChecks: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerRequests: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerResponseTime: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerResponses: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerState: MetricConfig{Enabled: false}, - NginxHTTPUpstreamPeerUnavailables: MetricConfig{Enabled: false}, - NginxHTTPUpstreamQueueLimit: MetricConfig{Enabled: false}, - NginxHTTPUpstreamQueueOverflows: MetricConfig{Enabled: false}, - NginxHTTPUpstreamQueueUsage: MetricConfig{Enabled: false}, - NginxHTTPUpstreamZombieCount: MetricConfig{Enabled: false}, - NginxSlabPageFree: MetricConfig{Enabled: false}, - NginxSlabPageLimit: MetricConfig{Enabled: false}, - NginxSlabPageUsage: MetricConfig{Enabled: false}, - NginxSlabPageUtilization: MetricConfig{Enabled: false}, - NginxSlabSlotAllocations: MetricConfig{Enabled: false}, - NginxSlabSlotFree: MetricConfig{Enabled: false}, - NginxSlabSlotUsage: MetricConfig{Enabled: false}, - NginxSslCertificateVerifyFailures: MetricConfig{Enabled: false}, - NginxSslHandshakes: MetricConfig{Enabled: false}, - NginxStreamByteIo: MetricConfig{Enabled: false}, - NginxStreamConnectionAccepted: MetricConfig{Enabled: false}, - NginxStreamConnectionDiscarded: MetricConfig{Enabled: false}, - NginxStreamConnectionProcessingCount: MetricConfig{Enabled: false}, - NginxStreamSessionStatus: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerByteIo: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerConnCount: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerConnTime: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerConns: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerCount: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerFails: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerHealthChecks: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerResponseTime: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerState: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerTtfbTime: MetricConfig{Enabled: false}, - NginxStreamUpstreamPeerUnavailable: MetricConfig{Enabled: false}, - NginxStreamUpstreamZombieCount: MetricConfig{Enabled: false}, + NginxCacheBytes: MetricConfig{Enabled: false}, + NginxCacheMemoryLimit: MetricConfig{Enabled: false}, + NginxCacheMemoryUsage: MetricConfig{Enabled: false}, + NginxCacheResponses: MetricConfig{Enabled: false}, + NginxConfigReloads: MetricConfig{Enabled: false}, + NginxHTTPConnections: MetricConfig{Enabled: false}, + NginxHTTPConnectionsCount: MetricConfig{Enabled: false}, + NginxHTTPLimitConnRequests: MetricConfig{Enabled: false}, + NginxHTTPLimitReqRequests: MetricConfig{Enabled: false}, + NginxHTTPRequestByteIo: MetricConfig{Enabled: false}, + NginxHTTPRequestDiscarded: MetricConfig{Enabled: false}, + NginxHTTPRequestProcessingCount: MetricConfig{Enabled: false}, + NginxHTTPRequests: MetricConfig{Enabled: false}, + NginxHTTPRequestsCount: MetricConfig{Enabled: false}, + NginxHTTPResponseStatus: MetricConfig{Enabled: false}, + NginxHTTPResponses: MetricConfig{Enabled: false}, + NginxHTTPUpstreamKeepaliveCount: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerByteIo: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerConnectionsCount: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerCount: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerFails: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerHeaderTime: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerHealthChecks: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerRequests: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerResponseTime: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerResponses: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerState: MetricConfig{Enabled: false}, + NginxHTTPUpstreamPeerUnavailables: MetricConfig{Enabled: false}, + NginxHTTPUpstreamQueueLimit: MetricConfig{Enabled: false}, + NginxHTTPUpstreamQueueOverflows: MetricConfig{Enabled: false}, + NginxHTTPUpstreamQueueUsage: MetricConfig{Enabled: false}, + NginxHTTPUpstreamZombieCount: MetricConfig{Enabled: false}, + NginxSlabPageFree: MetricConfig{Enabled: false}, + NginxSlabPageLimit: MetricConfig{Enabled: false}, + NginxSlabPageUsage: MetricConfig{Enabled: false}, + NginxSlabPageUtilization: MetricConfig{Enabled: false}, + NginxSlabSlotAllocations: MetricConfig{Enabled: false}, + NginxSlabSlotFree: MetricConfig{Enabled: false}, + NginxSlabSlotUsage: MetricConfig{Enabled: false}, + NginxSslCertificateVerifyFailures: MetricConfig{Enabled: false}, + NginxSslHandshakes: MetricConfig{Enabled: false}, + NginxStreamByteIo: MetricConfig{Enabled: false}, + NginxStreamConnectionsAccepted: MetricConfig{Enabled: false}, + NginxStreamConnectionsDiscarded: MetricConfig{Enabled: false}, + NginxStreamConnectionsProcessingCount: MetricConfig{Enabled: false}, + NginxStreamSessionStatus: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerByteIo: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerConnections: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerConnectionsCount: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerConnectionsTime: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerCount: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerFails: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerHealthChecks: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerResponseTime: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerState: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerTtfbTime: MetricConfig{Enabled: false}, + NginxStreamUpstreamPeerUnavailable: MetricConfig{Enabled: false}, + NginxStreamUpstreamZombieCount: MetricConfig{Enabled: false}, }, ResourceAttributes: ResourceAttributesConfig{ InstanceID: ResourceAttributeConfig{Enabled: false}, diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go index 21768959cd..1b0b6771be 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go @@ -84,38 +84,38 @@ var MapAttributeNginxCacheOutcome = map[string]AttributeNginxCacheOutcome{ "UPDATING": AttributeNginxCacheOutcomeUPDATING, } -// AttributeNginxConnOutcome specifies the a value nginx.conn.outcome attribute. -type AttributeNginxConnOutcome int +// AttributeNginxConnectionsOutcome specifies the a value nginx.connections.outcome attribute. +type AttributeNginxConnectionsOutcome int const ( - _ AttributeNginxConnOutcome = iota - AttributeNginxConnOutcomeACCEPTED - AttributeNginxConnOutcomeACTIVE - AttributeNginxConnOutcomeDROPPED - AttributeNginxConnOutcomeIDLE + _ AttributeNginxConnectionsOutcome = iota + AttributeNginxConnectionsOutcomeACCEPTED + AttributeNginxConnectionsOutcomeACTIVE + AttributeNginxConnectionsOutcomeDROPPED + AttributeNginxConnectionsOutcomeIDLE ) -// String returns the string representation of the AttributeNginxConnOutcome. -func (av AttributeNginxConnOutcome) String() string { +// String returns the string representation of the AttributeNginxConnectionsOutcome. +func (av AttributeNginxConnectionsOutcome) String() string { switch av { - case AttributeNginxConnOutcomeACCEPTED: + case AttributeNginxConnectionsOutcomeACCEPTED: return "ACCEPTED" - case AttributeNginxConnOutcomeACTIVE: + case AttributeNginxConnectionsOutcomeACTIVE: return "ACTIVE" - case AttributeNginxConnOutcomeDROPPED: + case AttributeNginxConnectionsOutcomeDROPPED: return "DROPPED" - case AttributeNginxConnOutcomeIDLE: + case AttributeNginxConnectionsOutcomeIDLE: return "IDLE" } return "" } -// MapAttributeNginxConnOutcome is a helper map of string to AttributeNginxConnOutcome attribute value. -var MapAttributeNginxConnOutcome = map[string]AttributeNginxConnOutcome{ - "ACCEPTED": AttributeNginxConnOutcomeACCEPTED, - "ACTIVE": AttributeNginxConnOutcomeACTIVE, - "DROPPED": AttributeNginxConnOutcomeDROPPED, - "IDLE": AttributeNginxConnOutcomeIDLE, +// MapAttributeNginxConnectionsOutcome is a helper map of string to AttributeNginxConnectionsOutcome attribute value. +var MapAttributeNginxConnectionsOutcome = map[string]AttributeNginxConnectionsOutcome{ + "ACCEPTED": AttributeNginxConnectionsOutcomeACCEPTED, + "ACTIVE": AttributeNginxConnectionsOutcomeACTIVE, + "DROPPED": AttributeNginxConnectionsOutcomeDROPPED, + "IDLE": AttributeNginxConnectionsOutcomeIDLE, } // AttributeNginxHealthCheck specifies the a value nginx.health_check attribute. @@ -703,15 +703,15 @@ func newMetricNginxConfigReloads(cfg MetricConfig) metricNginxConfigReloads { return m } -type metricNginxHTTPConn struct { +type metricNginxHTTPConnections 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") +// init fills nginx.http.connections metric with initial data. +func (m *metricNginxHTTPConnections) init() { + m.data.SetName("nginx.http.connections") m.data.SetDescription("The total number of connections.") m.data.SetUnit("connections") m.data.SetEmptySum() @@ -720,7 +720,7 @@ func (m *metricNginxHTTPConn) init() { m.data.Sum().DataPoints().EnsureCapacity(m.capacity) } -func (m *metricNginxHTTPConn) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxConnOutcomeAttributeValue string) { +func (m *metricNginxHTTPConnections) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxConnectionsOutcomeAttributeValue string) { if !m.config.Enabled { return } @@ -728,18 +728,18 @@ func (m *metricNginxHTTPConn) recordDataPoint(start pcommon.Timestamp, ts pcommo dp.SetStartTimestamp(start) dp.SetTimestamp(ts) dp.SetIntValue(val) - dp.Attributes().PutStr("nginx.conn.outcome", nginxConnOutcomeAttributeValue) + dp.Attributes().PutStr("nginx.connections.outcome", nginxConnectionsOutcomeAttributeValue) } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxHTTPConn) updateCapacity() { +func (m *metricNginxHTTPConnections) 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) { +func (m *metricNginxHTTPConnections) emit(metrics pmetric.MetricSlice) { if m.config.Enabled && m.data.Sum().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) @@ -747,8 +747,8 @@ func (m *metricNginxHTTPConn) emit(metrics pmetric.MetricSlice) { } } -func newMetricNginxHTTPConn(cfg MetricConfig) metricNginxHTTPConn { - m := metricNginxHTTPConn{config: cfg} +func newMetricNginxHTTPConnections(cfg MetricConfig) metricNginxHTTPConnections { + m := metricNginxHTTPConnections{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -756,22 +756,22 @@ func newMetricNginxHTTPConn(cfg MetricConfig) metricNginxHTTPConn { return m } -type metricNginxHTTPConnCount struct { +type metricNginxHTTPConnectionsCount 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") +// init fills nginx.http.connections.count metric with initial data. +func (m *metricNginxHTTPConnectionsCount) init() { + m.data.SetName("nginx.http.connections.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) { +func (m *metricNginxHTTPConnectionsCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxConnectionsOutcomeAttributeValue string) { if !m.config.Enabled { return } @@ -779,18 +779,18 @@ func (m *metricNginxHTTPConnCount) recordDataPoint(start pcommon.Timestamp, ts p dp.SetStartTimestamp(start) dp.SetTimestamp(ts) dp.SetIntValue(val) - dp.Attributes().PutStr("nginx.conn.outcome", nginxConnOutcomeAttributeValue) + dp.Attributes().PutStr("nginx.connections.outcome", nginxConnectionsOutcomeAttributeValue) } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxHTTPConnCount) updateCapacity() { +func (m *metricNginxHTTPConnectionsCount) 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) { +func (m *metricNginxHTTPConnectionsCount) emit(metrics pmetric.MetricSlice) { if m.config.Enabled && m.data.Gauge().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) @@ -798,8 +798,8 @@ func (m *metricNginxHTTPConnCount) emit(metrics pmetric.MetricSlice) { } } -func newMetricNginxHTTPConnCount(cfg MetricConfig) metricNginxHTTPConnCount { - m := metricNginxHTTPConnCount{config: cfg} +func newMetricNginxHTTPConnectionsCount(cfg MetricConfig) metricNginxHTTPConnectionsCount { + m := metricNginxHTTPConnectionsCount{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -1397,22 +1397,22 @@ func newMetricNginxHTTPUpstreamPeerByteIo(cfg MetricConfig) metricNginxHTTPUpstr return m } -type metricNginxHTTPUpstreamPeerConnCount struct { +type metricNginxHTTPUpstreamPeerConnectionsCount 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.upstream.peer.conn.count metric with initial data. -func (m *metricNginxHTTPUpstreamPeerConnCount) init() { - m.data.SetName("nginx.http.upstream.peer.conn.count") +// init fills nginx.http.upstream.peer.connections.count metric with initial data. +func (m *metricNginxHTTPUpstreamPeerConnectionsCount) init() { + m.data.SetName("nginx.http.upstream.peer.connections.count") m.data.SetDescription("The average number of active connections per HTTP upstream peer.") m.data.SetUnit("connections") m.data.SetEmptyGauge() m.data.Gauge().DataPoints().EnsureCapacity(m.capacity) } -func (m *metricNginxHTTPUpstreamPeerConnCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { +func (m *metricNginxHTTPUpstreamPeerConnectionsCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { if !m.config.Enabled { return } @@ -1427,14 +1427,14 @@ func (m *metricNginxHTTPUpstreamPeerConnCount) recordDataPoint(start pcommon.Tim } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxHTTPUpstreamPeerConnCount) updateCapacity() { +func (m *metricNginxHTTPUpstreamPeerConnectionsCount) 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 *metricNginxHTTPUpstreamPeerConnCount) emit(metrics pmetric.MetricSlice) { +func (m *metricNginxHTTPUpstreamPeerConnectionsCount) emit(metrics pmetric.MetricSlice) { if m.config.Enabled && m.data.Gauge().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) @@ -1442,8 +1442,8 @@ func (m *metricNginxHTTPUpstreamPeerConnCount) emit(metrics pmetric.MetricSlice) } } -func newMetricNginxHTTPUpstreamPeerConnCount(cfg MetricConfig) metricNginxHTTPUpstreamPeerConnCount { - m := metricNginxHTTPUpstreamPeerConnCount{config: cfg} +func newMetricNginxHTTPUpstreamPeerConnectionsCount(cfg MetricConfig) metricNginxHTTPUpstreamPeerConnectionsCount { + m := metricNginxHTTPUpstreamPeerConnectionsCount{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -2681,15 +2681,15 @@ func newMetricNginxStreamByteIo(cfg MetricConfig) metricNginxStreamByteIo { return m } -type metricNginxStreamConnectionAccepted struct { +type metricNginxStreamConnectionsAccepted 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.stream.connection.accepted metric with initial data. -func (m *metricNginxStreamConnectionAccepted) init() { - m.data.SetName("nginx.stream.connection.accepted") +// init fills nginx.stream.connections.accepted metric with initial data. +func (m *metricNginxStreamConnectionsAccepted) init() { + m.data.SetName("nginx.stream.connections.accepted") m.data.SetDescription("The total number of connections accepted from clients.") m.data.SetUnit("connections") m.data.SetEmptySum() @@ -2698,7 +2698,7 @@ func (m *metricNginxStreamConnectionAccepted) init() { m.data.Sum().DataPoints().EnsureCapacity(m.capacity) } -func (m *metricNginxStreamConnectionAccepted) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { +func (m *metricNginxStreamConnectionsAccepted) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { if !m.config.Enabled { return } @@ -2710,14 +2710,14 @@ func (m *metricNginxStreamConnectionAccepted) recordDataPoint(start pcommon.Time } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxStreamConnectionAccepted) updateCapacity() { +func (m *metricNginxStreamConnectionsAccepted) 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 *metricNginxStreamConnectionAccepted) emit(metrics pmetric.MetricSlice) { +func (m *metricNginxStreamConnectionsAccepted) emit(metrics pmetric.MetricSlice) { if m.config.Enabled && m.data.Sum().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) @@ -2725,8 +2725,8 @@ func (m *metricNginxStreamConnectionAccepted) emit(metrics pmetric.MetricSlice) } } -func newMetricNginxStreamConnectionAccepted(cfg MetricConfig) metricNginxStreamConnectionAccepted { - m := metricNginxStreamConnectionAccepted{config: cfg} +func newMetricNginxStreamConnectionsAccepted(cfg MetricConfig) metricNginxStreamConnectionsAccepted { + m := metricNginxStreamConnectionsAccepted{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -2734,15 +2734,15 @@ func newMetricNginxStreamConnectionAccepted(cfg MetricConfig) metricNginxStreamC return m } -type metricNginxStreamConnectionDiscarded struct { +type metricNginxStreamConnectionsDiscarded 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.stream.connection.discarded metric with initial data. -func (m *metricNginxStreamConnectionDiscarded) init() { - m.data.SetName("nginx.stream.connection.discarded") +// init fills nginx.stream.connections.discarded metric with initial data. +func (m *metricNginxStreamConnectionsDiscarded) init() { + m.data.SetName("nginx.stream.connections.discarded") m.data.SetDescription("Total number of connections completed without creating a session.") m.data.SetUnit("connections") m.data.SetEmptySum() @@ -2751,7 +2751,7 @@ func (m *metricNginxStreamConnectionDiscarded) init() { m.data.Sum().DataPoints().EnsureCapacity(m.capacity) } -func (m *metricNginxStreamConnectionDiscarded) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { +func (m *metricNginxStreamConnectionsDiscarded) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { if !m.config.Enabled { return } @@ -2763,14 +2763,14 @@ func (m *metricNginxStreamConnectionDiscarded) recordDataPoint(start pcommon.Tim } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxStreamConnectionDiscarded) updateCapacity() { +func (m *metricNginxStreamConnectionsDiscarded) 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 *metricNginxStreamConnectionDiscarded) emit(metrics pmetric.MetricSlice) { +func (m *metricNginxStreamConnectionsDiscarded) emit(metrics pmetric.MetricSlice) { if m.config.Enabled && m.data.Sum().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) @@ -2778,8 +2778,8 @@ func (m *metricNginxStreamConnectionDiscarded) emit(metrics pmetric.MetricSlice) } } -func newMetricNginxStreamConnectionDiscarded(cfg MetricConfig) metricNginxStreamConnectionDiscarded { - m := metricNginxStreamConnectionDiscarded{config: cfg} +func newMetricNginxStreamConnectionsDiscarded(cfg MetricConfig) metricNginxStreamConnectionsDiscarded { + m := metricNginxStreamConnectionsDiscarded{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -2787,22 +2787,22 @@ func newMetricNginxStreamConnectionDiscarded(cfg MetricConfig) metricNginxStream return m } -type metricNginxStreamConnectionProcessingCount struct { +type metricNginxStreamConnectionsProcessingCount 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.stream.connection.processing.count metric with initial data. -func (m *metricNginxStreamConnectionProcessingCount) init() { - m.data.SetName("nginx.stream.connection.processing.count") +// init fills nginx.stream.connections.processing.count metric with initial data. +func (m *metricNginxStreamConnectionsProcessingCount) init() { + m.data.SetName("nginx.stream.connections.processing.count") m.data.SetDescription("The number of client connections that are currently being processed.") m.data.SetUnit("connections") m.data.SetEmptyGauge() m.data.Gauge().DataPoints().EnsureCapacity(m.capacity) } -func (m *metricNginxStreamConnectionProcessingCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { +func (m *metricNginxStreamConnectionsProcessingCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { if !m.config.Enabled { return } @@ -2814,14 +2814,14 @@ func (m *metricNginxStreamConnectionProcessingCount) recordDataPoint(start pcomm } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxStreamConnectionProcessingCount) updateCapacity() { +func (m *metricNginxStreamConnectionsProcessingCount) 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 *metricNginxStreamConnectionProcessingCount) emit(metrics pmetric.MetricSlice) { +func (m *metricNginxStreamConnectionsProcessingCount) emit(metrics pmetric.MetricSlice) { if m.config.Enabled && m.data.Gauge().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) @@ -2829,8 +2829,8 @@ func (m *metricNginxStreamConnectionProcessingCount) emit(metrics pmetric.Metric } } -func newMetricNginxStreamConnectionProcessingCount(cfg MetricConfig) metricNginxStreamConnectionProcessingCount { - m := metricNginxStreamConnectionProcessingCount{config: cfg} +func newMetricNginxStreamConnectionsProcessingCount(cfg MetricConfig) metricNginxStreamConnectionsProcessingCount { + m := metricNginxStreamConnectionsProcessingCount{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -2949,26 +2949,28 @@ func newMetricNginxStreamUpstreamPeerByteIo(cfg MetricConfig) metricNginxStreamU return m } -type metricNginxStreamUpstreamPeerConnCount struct { +type metricNginxStreamUpstreamPeerConnections 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.stream.upstream.peer.conn.count metric with initial data. -func (m *metricNginxStreamUpstreamPeerConnCount) init() { - m.data.SetName("nginx.stream.upstream.peer.conn.count") - m.data.SetDescription("The current number of Stream Upstream Peer connections.") +// init fills nginx.stream.upstream.peer.connections metric with initial data. +func (m *metricNginxStreamUpstreamPeerConnections) init() { + m.data.SetName("nginx.stream.upstream.peer.connections") + m.data.SetDescription("The total number of client connections forwarded to this stream upstream peer.") m.data.SetUnit("connections") - m.data.SetEmptyGauge() - m.data.Gauge().DataPoints().EnsureCapacity(m.capacity) + m.data.SetEmptySum() + m.data.Sum().SetIsMonotonic(true) + m.data.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + m.data.Sum().DataPoints().EnsureCapacity(m.capacity) } -func (m *metricNginxStreamUpstreamPeerConnCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { +func (m *metricNginxStreamUpstreamPeerConnections) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { if !m.config.Enabled { return } - dp := m.data.Gauge().DataPoints().AppendEmpty() + dp := m.data.Sum().DataPoints().AppendEmpty() dp.SetStartTimestamp(start) dp.SetTimestamp(ts) dp.SetIntValue(val) @@ -2979,23 +2981,23 @@ func (m *metricNginxStreamUpstreamPeerConnCount) recordDataPoint(start pcommon.T } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxStreamUpstreamPeerConnCount) updateCapacity() { - if m.data.Gauge().DataPoints().Len() > m.capacity { - m.capacity = m.data.Gauge().DataPoints().Len() +func (m *metricNginxStreamUpstreamPeerConnections) 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 *metricNginxStreamUpstreamPeerConnCount) emit(metrics pmetric.MetricSlice) { - if m.config.Enabled && m.data.Gauge().DataPoints().Len() > 0 { +func (m *metricNginxStreamUpstreamPeerConnections) emit(metrics pmetric.MetricSlice) { + if m.config.Enabled && m.data.Sum().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) m.init() } } -func newMetricNginxStreamUpstreamPeerConnCount(cfg MetricConfig) metricNginxStreamUpstreamPeerConnCount { - m := metricNginxStreamUpstreamPeerConnCount{config: cfg} +func newMetricNginxStreamUpstreamPeerConnections(cfg MetricConfig) metricNginxStreamUpstreamPeerConnections { + m := metricNginxStreamUpstreamPeerConnections{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -3003,22 +3005,22 @@ func newMetricNginxStreamUpstreamPeerConnCount(cfg MetricConfig) metricNginxStre return m } -type metricNginxStreamUpstreamPeerConnTime struct { +type metricNginxStreamUpstreamPeerConnectionsCount 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.stream.upstream.peer.conn.time metric with initial data. -func (m *metricNginxStreamUpstreamPeerConnTime) init() { - m.data.SetName("nginx.stream.upstream.peer.conn.time") - m.data.SetDescription("The average time to connect to the stream upstream peer.") - m.data.SetUnit("ms") +// init fills nginx.stream.upstream.peer.connections.count metric with initial data. +func (m *metricNginxStreamUpstreamPeerConnectionsCount) init() { + m.data.SetName("nginx.stream.upstream.peer.connections.count") + m.data.SetDescription("The current number of Stream Upstream Peer connections.") + m.data.SetUnit("connections") m.data.SetEmptyGauge() m.data.Gauge().DataPoints().EnsureCapacity(m.capacity) } -func (m *metricNginxStreamUpstreamPeerConnTime) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { +func (m *metricNginxStreamUpstreamPeerConnectionsCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { if !m.config.Enabled { return } @@ -3033,14 +3035,14 @@ func (m *metricNginxStreamUpstreamPeerConnTime) recordDataPoint(start pcommon.Ti } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxStreamUpstreamPeerConnTime) updateCapacity() { +func (m *metricNginxStreamUpstreamPeerConnectionsCount) 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 *metricNginxStreamUpstreamPeerConnTime) emit(metrics pmetric.MetricSlice) { +func (m *metricNginxStreamUpstreamPeerConnectionsCount) emit(metrics pmetric.MetricSlice) { if m.config.Enabled && m.data.Gauge().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) @@ -3048,8 +3050,8 @@ func (m *metricNginxStreamUpstreamPeerConnTime) emit(metrics pmetric.MetricSlice } } -func newMetricNginxStreamUpstreamPeerConnTime(cfg MetricConfig) metricNginxStreamUpstreamPeerConnTime { - m := metricNginxStreamUpstreamPeerConnTime{config: cfg} +func newMetricNginxStreamUpstreamPeerConnectionsCount(cfg MetricConfig) metricNginxStreamUpstreamPeerConnectionsCount { + m := metricNginxStreamUpstreamPeerConnectionsCount{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -3057,28 +3059,26 @@ func newMetricNginxStreamUpstreamPeerConnTime(cfg MetricConfig) metricNginxStrea return m } -type metricNginxStreamUpstreamPeerConns struct { +type metricNginxStreamUpstreamPeerConnectionsTime 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.stream.upstream.peer.conns metric with initial data. -func (m *metricNginxStreamUpstreamPeerConns) init() { - m.data.SetName("nginx.stream.upstream.peer.conns") - m.data.SetDescription("The total number of client connections forwarded to this stream upstream peer.") - 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) +// init fills nginx.stream.upstream.peer.connections.time metric with initial data. +func (m *metricNginxStreamUpstreamPeerConnectionsTime) init() { + m.data.SetName("nginx.stream.upstream.peer.connections.time") + m.data.SetDescription("The average time to connect to the stream upstream peer.") + m.data.SetUnit("ms") + m.data.SetEmptyGauge() + m.data.Gauge().DataPoints().EnsureCapacity(m.capacity) } -func (m *metricNginxStreamUpstreamPeerConns) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { +func (m *metricNginxStreamUpstreamPeerConnectionsTime) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { if !m.config.Enabled { return } - dp := m.data.Sum().DataPoints().AppendEmpty() + dp := m.data.Gauge().DataPoints().AppendEmpty() dp.SetStartTimestamp(start) dp.SetTimestamp(ts) dp.SetIntValue(val) @@ -3089,23 +3089,23 @@ func (m *metricNginxStreamUpstreamPeerConns) recordDataPoint(start pcommon.Times } // updateCapacity saves max length of data point slices that will be used for the slice capacity. -func (m *metricNginxStreamUpstreamPeerConns) updateCapacity() { - if m.data.Sum().DataPoints().Len() > m.capacity { - m.capacity = m.data.Sum().DataPoints().Len() +func (m *metricNginxStreamUpstreamPeerConnectionsTime) 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 *metricNginxStreamUpstreamPeerConns) emit(metrics pmetric.MetricSlice) { - if m.config.Enabled && m.data.Sum().DataPoints().Len() > 0 { +func (m *metricNginxStreamUpstreamPeerConnectionsTime) emit(metrics pmetric.MetricSlice) { + if m.config.Enabled && m.data.Gauge().DataPoints().Len() > 0 { m.updateCapacity() m.data.MoveTo(metrics.AppendEmpty()) m.init() } } -func newMetricNginxStreamUpstreamPeerConns(cfg MetricConfig) metricNginxStreamUpstreamPeerConns { - m := metricNginxStreamUpstreamPeerConns{config: cfg} +func newMetricNginxStreamUpstreamPeerConnectionsTime(cfg MetricConfig) metricNginxStreamUpstreamPeerConnectionsTime { + m := metricNginxStreamUpstreamPeerConnectionsTime{config: cfg} if cfg.Enabled { m.data = pmetric.NewMetric() m.init() @@ -3556,71 +3556,71 @@ func newMetricNginxStreamUpstreamZombieCount(cfg MetricConfig) metricNginxStream // 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. - resourceAttributeIncludeFilter map[string]filter.Filter - resourceAttributeExcludeFilter map[string]filter.Filter - metricNginxCacheBytes metricNginxCacheBytes - metricNginxCacheMemoryLimit metricNginxCacheMemoryLimit - metricNginxCacheMemoryUsage metricNginxCacheMemoryUsage - metricNginxCacheResponses metricNginxCacheResponses - metricNginxConfigReloads metricNginxConfigReloads - metricNginxHTTPConn metricNginxHTTPConn - metricNginxHTTPConnCount metricNginxHTTPConnCount - metricNginxHTTPLimitConnRequests metricNginxHTTPLimitConnRequests - metricNginxHTTPLimitReqRequests metricNginxHTTPLimitReqRequests - metricNginxHTTPRequestByteIo metricNginxHTTPRequestByteIo - metricNginxHTTPRequestDiscarded metricNginxHTTPRequestDiscarded - metricNginxHTTPRequestProcessingCount metricNginxHTTPRequestProcessingCount - metricNginxHTTPRequests metricNginxHTTPRequests - metricNginxHTTPRequestsCount metricNginxHTTPRequestsCount - metricNginxHTTPResponseStatus metricNginxHTTPResponseStatus - metricNginxHTTPResponses metricNginxHTTPResponses - metricNginxHTTPUpstreamKeepaliveCount metricNginxHTTPUpstreamKeepaliveCount - metricNginxHTTPUpstreamPeerByteIo metricNginxHTTPUpstreamPeerByteIo - metricNginxHTTPUpstreamPeerConnCount metricNginxHTTPUpstreamPeerConnCount - metricNginxHTTPUpstreamPeerCount metricNginxHTTPUpstreamPeerCount - metricNginxHTTPUpstreamPeerFails metricNginxHTTPUpstreamPeerFails - metricNginxHTTPUpstreamPeerHeaderTime metricNginxHTTPUpstreamPeerHeaderTime - metricNginxHTTPUpstreamPeerHealthChecks metricNginxHTTPUpstreamPeerHealthChecks - metricNginxHTTPUpstreamPeerRequests metricNginxHTTPUpstreamPeerRequests - metricNginxHTTPUpstreamPeerResponseTime metricNginxHTTPUpstreamPeerResponseTime - metricNginxHTTPUpstreamPeerResponses metricNginxHTTPUpstreamPeerResponses - metricNginxHTTPUpstreamPeerState metricNginxHTTPUpstreamPeerState - metricNginxHTTPUpstreamPeerUnavailables metricNginxHTTPUpstreamPeerUnavailables - metricNginxHTTPUpstreamQueueLimit metricNginxHTTPUpstreamQueueLimit - metricNginxHTTPUpstreamQueueOverflows metricNginxHTTPUpstreamQueueOverflows - metricNginxHTTPUpstreamQueueUsage metricNginxHTTPUpstreamQueueUsage - metricNginxHTTPUpstreamZombieCount metricNginxHTTPUpstreamZombieCount - metricNginxSlabPageFree metricNginxSlabPageFree - metricNginxSlabPageLimit metricNginxSlabPageLimit - metricNginxSlabPageUsage metricNginxSlabPageUsage - metricNginxSlabPageUtilization metricNginxSlabPageUtilization - metricNginxSlabSlotAllocations metricNginxSlabSlotAllocations - metricNginxSlabSlotFree metricNginxSlabSlotFree - metricNginxSlabSlotUsage metricNginxSlabSlotUsage - metricNginxSslCertificateVerifyFailures metricNginxSslCertificateVerifyFailures - metricNginxSslHandshakes metricNginxSslHandshakes - metricNginxStreamByteIo metricNginxStreamByteIo - metricNginxStreamConnectionAccepted metricNginxStreamConnectionAccepted - metricNginxStreamConnectionDiscarded metricNginxStreamConnectionDiscarded - metricNginxStreamConnectionProcessingCount metricNginxStreamConnectionProcessingCount - metricNginxStreamSessionStatus metricNginxStreamSessionStatus - metricNginxStreamUpstreamPeerByteIo metricNginxStreamUpstreamPeerByteIo - metricNginxStreamUpstreamPeerConnCount metricNginxStreamUpstreamPeerConnCount - metricNginxStreamUpstreamPeerConnTime metricNginxStreamUpstreamPeerConnTime - metricNginxStreamUpstreamPeerConns metricNginxStreamUpstreamPeerConns - metricNginxStreamUpstreamPeerCount metricNginxStreamUpstreamPeerCount - metricNginxStreamUpstreamPeerFails metricNginxStreamUpstreamPeerFails - metricNginxStreamUpstreamPeerHealthChecks metricNginxStreamUpstreamPeerHealthChecks - metricNginxStreamUpstreamPeerResponseTime metricNginxStreamUpstreamPeerResponseTime - metricNginxStreamUpstreamPeerState metricNginxStreamUpstreamPeerState - metricNginxStreamUpstreamPeerTtfbTime metricNginxStreamUpstreamPeerTtfbTime - metricNginxStreamUpstreamPeerUnavailable metricNginxStreamUpstreamPeerUnavailable - metricNginxStreamUpstreamZombieCount metricNginxStreamUpstreamZombieCount + 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. + resourceAttributeIncludeFilter map[string]filter.Filter + resourceAttributeExcludeFilter map[string]filter.Filter + metricNginxCacheBytes metricNginxCacheBytes + metricNginxCacheMemoryLimit metricNginxCacheMemoryLimit + metricNginxCacheMemoryUsage metricNginxCacheMemoryUsage + metricNginxCacheResponses metricNginxCacheResponses + metricNginxConfigReloads metricNginxConfigReloads + metricNginxHTTPConnections metricNginxHTTPConnections + metricNginxHTTPConnectionsCount metricNginxHTTPConnectionsCount + metricNginxHTTPLimitConnRequests metricNginxHTTPLimitConnRequests + metricNginxHTTPLimitReqRequests metricNginxHTTPLimitReqRequests + metricNginxHTTPRequestByteIo metricNginxHTTPRequestByteIo + metricNginxHTTPRequestDiscarded metricNginxHTTPRequestDiscarded + metricNginxHTTPRequestProcessingCount metricNginxHTTPRequestProcessingCount + metricNginxHTTPRequests metricNginxHTTPRequests + metricNginxHTTPRequestsCount metricNginxHTTPRequestsCount + metricNginxHTTPResponseStatus metricNginxHTTPResponseStatus + metricNginxHTTPResponses metricNginxHTTPResponses + metricNginxHTTPUpstreamKeepaliveCount metricNginxHTTPUpstreamKeepaliveCount + metricNginxHTTPUpstreamPeerByteIo metricNginxHTTPUpstreamPeerByteIo + metricNginxHTTPUpstreamPeerConnectionsCount metricNginxHTTPUpstreamPeerConnectionsCount + metricNginxHTTPUpstreamPeerCount metricNginxHTTPUpstreamPeerCount + metricNginxHTTPUpstreamPeerFails metricNginxHTTPUpstreamPeerFails + metricNginxHTTPUpstreamPeerHeaderTime metricNginxHTTPUpstreamPeerHeaderTime + metricNginxHTTPUpstreamPeerHealthChecks metricNginxHTTPUpstreamPeerHealthChecks + metricNginxHTTPUpstreamPeerRequests metricNginxHTTPUpstreamPeerRequests + metricNginxHTTPUpstreamPeerResponseTime metricNginxHTTPUpstreamPeerResponseTime + metricNginxHTTPUpstreamPeerResponses metricNginxHTTPUpstreamPeerResponses + metricNginxHTTPUpstreamPeerState metricNginxHTTPUpstreamPeerState + metricNginxHTTPUpstreamPeerUnavailables metricNginxHTTPUpstreamPeerUnavailables + metricNginxHTTPUpstreamQueueLimit metricNginxHTTPUpstreamQueueLimit + metricNginxHTTPUpstreamQueueOverflows metricNginxHTTPUpstreamQueueOverflows + metricNginxHTTPUpstreamQueueUsage metricNginxHTTPUpstreamQueueUsage + metricNginxHTTPUpstreamZombieCount metricNginxHTTPUpstreamZombieCount + metricNginxSlabPageFree metricNginxSlabPageFree + metricNginxSlabPageLimit metricNginxSlabPageLimit + metricNginxSlabPageUsage metricNginxSlabPageUsage + metricNginxSlabPageUtilization metricNginxSlabPageUtilization + metricNginxSlabSlotAllocations metricNginxSlabSlotAllocations + metricNginxSlabSlotFree metricNginxSlabSlotFree + metricNginxSlabSlotUsage metricNginxSlabSlotUsage + metricNginxSslCertificateVerifyFailures metricNginxSslCertificateVerifyFailures + metricNginxSslHandshakes metricNginxSslHandshakes + metricNginxStreamByteIo metricNginxStreamByteIo + metricNginxStreamConnectionsAccepted metricNginxStreamConnectionsAccepted + metricNginxStreamConnectionsDiscarded metricNginxStreamConnectionsDiscarded + metricNginxStreamConnectionsProcessingCount metricNginxStreamConnectionsProcessingCount + metricNginxStreamSessionStatus metricNginxStreamSessionStatus + metricNginxStreamUpstreamPeerByteIo metricNginxStreamUpstreamPeerByteIo + metricNginxStreamUpstreamPeerConnections metricNginxStreamUpstreamPeerConnections + metricNginxStreamUpstreamPeerConnectionsCount metricNginxStreamUpstreamPeerConnectionsCount + metricNginxStreamUpstreamPeerConnectionsTime metricNginxStreamUpstreamPeerConnectionsTime + metricNginxStreamUpstreamPeerCount metricNginxStreamUpstreamPeerCount + metricNginxStreamUpstreamPeerFails metricNginxStreamUpstreamPeerFails + metricNginxStreamUpstreamPeerHealthChecks metricNginxStreamUpstreamPeerHealthChecks + metricNginxStreamUpstreamPeerResponseTime metricNginxStreamUpstreamPeerResponseTime + metricNginxStreamUpstreamPeerState metricNginxStreamUpstreamPeerState + metricNginxStreamUpstreamPeerTtfbTime metricNginxStreamUpstreamPeerTtfbTime + metricNginxStreamUpstreamPeerUnavailable metricNginxStreamUpstreamPeerUnavailable + metricNginxStreamUpstreamZombieCount metricNginxStreamUpstreamZombieCount } // metricBuilderOption applies changes to default metrics builder. @@ -3635,70 +3635,70 @@ func WithStartTime(startTime pcommon.Timestamp) metricBuilderOption { 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, - metricNginxCacheBytes: newMetricNginxCacheBytes(mbc.Metrics.NginxCacheBytes), - metricNginxCacheMemoryLimit: newMetricNginxCacheMemoryLimit(mbc.Metrics.NginxCacheMemoryLimit), - metricNginxCacheMemoryUsage: newMetricNginxCacheMemoryUsage(mbc.Metrics.NginxCacheMemoryUsage), - metricNginxCacheResponses: newMetricNginxCacheResponses(mbc.Metrics.NginxCacheResponses), - metricNginxConfigReloads: newMetricNginxConfigReloads(mbc.Metrics.NginxConfigReloads), - metricNginxHTTPConn: newMetricNginxHTTPConn(mbc.Metrics.NginxHTTPConn), - metricNginxHTTPConnCount: newMetricNginxHTTPConnCount(mbc.Metrics.NginxHTTPConnCount), - metricNginxHTTPLimitConnRequests: newMetricNginxHTTPLimitConnRequests(mbc.Metrics.NginxHTTPLimitConnRequests), - metricNginxHTTPLimitReqRequests: newMetricNginxHTTPLimitReqRequests(mbc.Metrics.NginxHTTPLimitReqRequests), - metricNginxHTTPRequestByteIo: newMetricNginxHTTPRequestByteIo(mbc.Metrics.NginxHTTPRequestByteIo), - metricNginxHTTPRequestDiscarded: newMetricNginxHTTPRequestDiscarded(mbc.Metrics.NginxHTTPRequestDiscarded), - metricNginxHTTPRequestProcessingCount: newMetricNginxHTTPRequestProcessingCount(mbc.Metrics.NginxHTTPRequestProcessingCount), - metricNginxHTTPRequests: newMetricNginxHTTPRequests(mbc.Metrics.NginxHTTPRequests), - metricNginxHTTPRequestsCount: newMetricNginxHTTPRequestsCount(mbc.Metrics.NginxHTTPRequestsCount), - metricNginxHTTPResponseStatus: newMetricNginxHTTPResponseStatus(mbc.Metrics.NginxHTTPResponseStatus), - metricNginxHTTPResponses: newMetricNginxHTTPResponses(mbc.Metrics.NginxHTTPResponses), - metricNginxHTTPUpstreamKeepaliveCount: newMetricNginxHTTPUpstreamKeepaliveCount(mbc.Metrics.NginxHTTPUpstreamKeepaliveCount), - metricNginxHTTPUpstreamPeerByteIo: newMetricNginxHTTPUpstreamPeerByteIo(mbc.Metrics.NginxHTTPUpstreamPeerByteIo), - metricNginxHTTPUpstreamPeerConnCount: newMetricNginxHTTPUpstreamPeerConnCount(mbc.Metrics.NginxHTTPUpstreamPeerConnCount), - metricNginxHTTPUpstreamPeerCount: newMetricNginxHTTPUpstreamPeerCount(mbc.Metrics.NginxHTTPUpstreamPeerCount), - metricNginxHTTPUpstreamPeerFails: newMetricNginxHTTPUpstreamPeerFails(mbc.Metrics.NginxHTTPUpstreamPeerFails), - metricNginxHTTPUpstreamPeerHeaderTime: newMetricNginxHTTPUpstreamPeerHeaderTime(mbc.Metrics.NginxHTTPUpstreamPeerHeaderTime), - metricNginxHTTPUpstreamPeerHealthChecks: newMetricNginxHTTPUpstreamPeerHealthChecks(mbc.Metrics.NginxHTTPUpstreamPeerHealthChecks), - metricNginxHTTPUpstreamPeerRequests: newMetricNginxHTTPUpstreamPeerRequests(mbc.Metrics.NginxHTTPUpstreamPeerRequests), - metricNginxHTTPUpstreamPeerResponseTime: newMetricNginxHTTPUpstreamPeerResponseTime(mbc.Metrics.NginxHTTPUpstreamPeerResponseTime), - metricNginxHTTPUpstreamPeerResponses: newMetricNginxHTTPUpstreamPeerResponses(mbc.Metrics.NginxHTTPUpstreamPeerResponses), - metricNginxHTTPUpstreamPeerState: newMetricNginxHTTPUpstreamPeerState(mbc.Metrics.NginxHTTPUpstreamPeerState), - metricNginxHTTPUpstreamPeerUnavailables: newMetricNginxHTTPUpstreamPeerUnavailables(mbc.Metrics.NginxHTTPUpstreamPeerUnavailables), - metricNginxHTTPUpstreamQueueLimit: newMetricNginxHTTPUpstreamQueueLimit(mbc.Metrics.NginxHTTPUpstreamQueueLimit), - metricNginxHTTPUpstreamQueueOverflows: newMetricNginxHTTPUpstreamQueueOverflows(mbc.Metrics.NginxHTTPUpstreamQueueOverflows), - metricNginxHTTPUpstreamQueueUsage: newMetricNginxHTTPUpstreamQueueUsage(mbc.Metrics.NginxHTTPUpstreamQueueUsage), - metricNginxHTTPUpstreamZombieCount: newMetricNginxHTTPUpstreamZombieCount(mbc.Metrics.NginxHTTPUpstreamZombieCount), - metricNginxSlabPageFree: newMetricNginxSlabPageFree(mbc.Metrics.NginxSlabPageFree), - metricNginxSlabPageLimit: newMetricNginxSlabPageLimit(mbc.Metrics.NginxSlabPageLimit), - metricNginxSlabPageUsage: newMetricNginxSlabPageUsage(mbc.Metrics.NginxSlabPageUsage), - metricNginxSlabPageUtilization: newMetricNginxSlabPageUtilization(mbc.Metrics.NginxSlabPageUtilization), - metricNginxSlabSlotAllocations: newMetricNginxSlabSlotAllocations(mbc.Metrics.NginxSlabSlotAllocations), - metricNginxSlabSlotFree: newMetricNginxSlabSlotFree(mbc.Metrics.NginxSlabSlotFree), - metricNginxSlabSlotUsage: newMetricNginxSlabSlotUsage(mbc.Metrics.NginxSlabSlotUsage), - metricNginxSslCertificateVerifyFailures: newMetricNginxSslCertificateVerifyFailures(mbc.Metrics.NginxSslCertificateVerifyFailures), - metricNginxSslHandshakes: newMetricNginxSslHandshakes(mbc.Metrics.NginxSslHandshakes), - metricNginxStreamByteIo: newMetricNginxStreamByteIo(mbc.Metrics.NginxStreamByteIo), - metricNginxStreamConnectionAccepted: newMetricNginxStreamConnectionAccepted(mbc.Metrics.NginxStreamConnectionAccepted), - metricNginxStreamConnectionDiscarded: newMetricNginxStreamConnectionDiscarded(mbc.Metrics.NginxStreamConnectionDiscarded), - metricNginxStreamConnectionProcessingCount: newMetricNginxStreamConnectionProcessingCount(mbc.Metrics.NginxStreamConnectionProcessingCount), - metricNginxStreamSessionStatus: newMetricNginxStreamSessionStatus(mbc.Metrics.NginxStreamSessionStatus), - metricNginxStreamUpstreamPeerByteIo: newMetricNginxStreamUpstreamPeerByteIo(mbc.Metrics.NginxStreamUpstreamPeerByteIo), - metricNginxStreamUpstreamPeerConnCount: newMetricNginxStreamUpstreamPeerConnCount(mbc.Metrics.NginxStreamUpstreamPeerConnCount), - metricNginxStreamUpstreamPeerConnTime: newMetricNginxStreamUpstreamPeerConnTime(mbc.Metrics.NginxStreamUpstreamPeerConnTime), - metricNginxStreamUpstreamPeerConns: newMetricNginxStreamUpstreamPeerConns(mbc.Metrics.NginxStreamUpstreamPeerConns), - metricNginxStreamUpstreamPeerCount: newMetricNginxStreamUpstreamPeerCount(mbc.Metrics.NginxStreamUpstreamPeerCount), - metricNginxStreamUpstreamPeerFails: newMetricNginxStreamUpstreamPeerFails(mbc.Metrics.NginxStreamUpstreamPeerFails), - metricNginxStreamUpstreamPeerHealthChecks: newMetricNginxStreamUpstreamPeerHealthChecks(mbc.Metrics.NginxStreamUpstreamPeerHealthChecks), - metricNginxStreamUpstreamPeerResponseTime: newMetricNginxStreamUpstreamPeerResponseTime(mbc.Metrics.NginxStreamUpstreamPeerResponseTime), - metricNginxStreamUpstreamPeerState: newMetricNginxStreamUpstreamPeerState(mbc.Metrics.NginxStreamUpstreamPeerState), - metricNginxStreamUpstreamPeerTtfbTime: newMetricNginxStreamUpstreamPeerTtfbTime(mbc.Metrics.NginxStreamUpstreamPeerTtfbTime), - metricNginxStreamUpstreamPeerUnavailable: newMetricNginxStreamUpstreamPeerUnavailable(mbc.Metrics.NginxStreamUpstreamPeerUnavailable), - metricNginxStreamUpstreamZombieCount: newMetricNginxStreamUpstreamZombieCount(mbc.Metrics.NginxStreamUpstreamZombieCount), - resourceAttributeIncludeFilter: make(map[string]filter.Filter), - resourceAttributeExcludeFilter: make(map[string]filter.Filter), + config: mbc, + startTime: pcommon.NewTimestampFromTime(time.Now()), + metricsBuffer: pmetric.NewMetrics(), + buildInfo: settings.BuildInfo, + metricNginxCacheBytes: newMetricNginxCacheBytes(mbc.Metrics.NginxCacheBytes), + metricNginxCacheMemoryLimit: newMetricNginxCacheMemoryLimit(mbc.Metrics.NginxCacheMemoryLimit), + metricNginxCacheMemoryUsage: newMetricNginxCacheMemoryUsage(mbc.Metrics.NginxCacheMemoryUsage), + metricNginxCacheResponses: newMetricNginxCacheResponses(mbc.Metrics.NginxCacheResponses), + metricNginxConfigReloads: newMetricNginxConfigReloads(mbc.Metrics.NginxConfigReloads), + metricNginxHTTPConnections: newMetricNginxHTTPConnections(mbc.Metrics.NginxHTTPConnections), + metricNginxHTTPConnectionsCount: newMetricNginxHTTPConnectionsCount(mbc.Metrics.NginxHTTPConnectionsCount), + metricNginxHTTPLimitConnRequests: newMetricNginxHTTPLimitConnRequests(mbc.Metrics.NginxHTTPLimitConnRequests), + metricNginxHTTPLimitReqRequests: newMetricNginxHTTPLimitReqRequests(mbc.Metrics.NginxHTTPLimitReqRequests), + metricNginxHTTPRequestByteIo: newMetricNginxHTTPRequestByteIo(mbc.Metrics.NginxHTTPRequestByteIo), + metricNginxHTTPRequestDiscarded: newMetricNginxHTTPRequestDiscarded(mbc.Metrics.NginxHTTPRequestDiscarded), + metricNginxHTTPRequestProcessingCount: newMetricNginxHTTPRequestProcessingCount(mbc.Metrics.NginxHTTPRequestProcessingCount), + metricNginxHTTPRequests: newMetricNginxHTTPRequests(mbc.Metrics.NginxHTTPRequests), + metricNginxHTTPRequestsCount: newMetricNginxHTTPRequestsCount(mbc.Metrics.NginxHTTPRequestsCount), + metricNginxHTTPResponseStatus: newMetricNginxHTTPResponseStatus(mbc.Metrics.NginxHTTPResponseStatus), + metricNginxHTTPResponses: newMetricNginxHTTPResponses(mbc.Metrics.NginxHTTPResponses), + metricNginxHTTPUpstreamKeepaliveCount: newMetricNginxHTTPUpstreamKeepaliveCount(mbc.Metrics.NginxHTTPUpstreamKeepaliveCount), + metricNginxHTTPUpstreamPeerByteIo: newMetricNginxHTTPUpstreamPeerByteIo(mbc.Metrics.NginxHTTPUpstreamPeerByteIo), + metricNginxHTTPUpstreamPeerConnectionsCount: newMetricNginxHTTPUpstreamPeerConnectionsCount(mbc.Metrics.NginxHTTPUpstreamPeerConnectionsCount), + metricNginxHTTPUpstreamPeerCount: newMetricNginxHTTPUpstreamPeerCount(mbc.Metrics.NginxHTTPUpstreamPeerCount), + metricNginxHTTPUpstreamPeerFails: newMetricNginxHTTPUpstreamPeerFails(mbc.Metrics.NginxHTTPUpstreamPeerFails), + metricNginxHTTPUpstreamPeerHeaderTime: newMetricNginxHTTPUpstreamPeerHeaderTime(mbc.Metrics.NginxHTTPUpstreamPeerHeaderTime), + metricNginxHTTPUpstreamPeerHealthChecks: newMetricNginxHTTPUpstreamPeerHealthChecks(mbc.Metrics.NginxHTTPUpstreamPeerHealthChecks), + metricNginxHTTPUpstreamPeerRequests: newMetricNginxHTTPUpstreamPeerRequests(mbc.Metrics.NginxHTTPUpstreamPeerRequests), + metricNginxHTTPUpstreamPeerResponseTime: newMetricNginxHTTPUpstreamPeerResponseTime(mbc.Metrics.NginxHTTPUpstreamPeerResponseTime), + metricNginxHTTPUpstreamPeerResponses: newMetricNginxHTTPUpstreamPeerResponses(mbc.Metrics.NginxHTTPUpstreamPeerResponses), + metricNginxHTTPUpstreamPeerState: newMetricNginxHTTPUpstreamPeerState(mbc.Metrics.NginxHTTPUpstreamPeerState), + metricNginxHTTPUpstreamPeerUnavailables: newMetricNginxHTTPUpstreamPeerUnavailables(mbc.Metrics.NginxHTTPUpstreamPeerUnavailables), + metricNginxHTTPUpstreamQueueLimit: newMetricNginxHTTPUpstreamQueueLimit(mbc.Metrics.NginxHTTPUpstreamQueueLimit), + metricNginxHTTPUpstreamQueueOverflows: newMetricNginxHTTPUpstreamQueueOverflows(mbc.Metrics.NginxHTTPUpstreamQueueOverflows), + metricNginxHTTPUpstreamQueueUsage: newMetricNginxHTTPUpstreamQueueUsage(mbc.Metrics.NginxHTTPUpstreamQueueUsage), + metricNginxHTTPUpstreamZombieCount: newMetricNginxHTTPUpstreamZombieCount(mbc.Metrics.NginxHTTPUpstreamZombieCount), + metricNginxSlabPageFree: newMetricNginxSlabPageFree(mbc.Metrics.NginxSlabPageFree), + metricNginxSlabPageLimit: newMetricNginxSlabPageLimit(mbc.Metrics.NginxSlabPageLimit), + metricNginxSlabPageUsage: newMetricNginxSlabPageUsage(mbc.Metrics.NginxSlabPageUsage), + metricNginxSlabPageUtilization: newMetricNginxSlabPageUtilization(mbc.Metrics.NginxSlabPageUtilization), + metricNginxSlabSlotAllocations: newMetricNginxSlabSlotAllocations(mbc.Metrics.NginxSlabSlotAllocations), + metricNginxSlabSlotFree: newMetricNginxSlabSlotFree(mbc.Metrics.NginxSlabSlotFree), + metricNginxSlabSlotUsage: newMetricNginxSlabSlotUsage(mbc.Metrics.NginxSlabSlotUsage), + metricNginxSslCertificateVerifyFailures: newMetricNginxSslCertificateVerifyFailures(mbc.Metrics.NginxSslCertificateVerifyFailures), + metricNginxSslHandshakes: newMetricNginxSslHandshakes(mbc.Metrics.NginxSslHandshakes), + metricNginxStreamByteIo: newMetricNginxStreamByteIo(mbc.Metrics.NginxStreamByteIo), + metricNginxStreamConnectionsAccepted: newMetricNginxStreamConnectionsAccepted(mbc.Metrics.NginxStreamConnectionsAccepted), + metricNginxStreamConnectionsDiscarded: newMetricNginxStreamConnectionsDiscarded(mbc.Metrics.NginxStreamConnectionsDiscarded), + metricNginxStreamConnectionsProcessingCount: newMetricNginxStreamConnectionsProcessingCount(mbc.Metrics.NginxStreamConnectionsProcessingCount), + metricNginxStreamSessionStatus: newMetricNginxStreamSessionStatus(mbc.Metrics.NginxStreamSessionStatus), + metricNginxStreamUpstreamPeerByteIo: newMetricNginxStreamUpstreamPeerByteIo(mbc.Metrics.NginxStreamUpstreamPeerByteIo), + metricNginxStreamUpstreamPeerConnections: newMetricNginxStreamUpstreamPeerConnections(mbc.Metrics.NginxStreamUpstreamPeerConnections), + metricNginxStreamUpstreamPeerConnectionsCount: newMetricNginxStreamUpstreamPeerConnectionsCount(mbc.Metrics.NginxStreamUpstreamPeerConnectionsCount), + metricNginxStreamUpstreamPeerConnectionsTime: newMetricNginxStreamUpstreamPeerConnectionsTime(mbc.Metrics.NginxStreamUpstreamPeerConnectionsTime), + metricNginxStreamUpstreamPeerCount: newMetricNginxStreamUpstreamPeerCount(mbc.Metrics.NginxStreamUpstreamPeerCount), + metricNginxStreamUpstreamPeerFails: newMetricNginxStreamUpstreamPeerFails(mbc.Metrics.NginxStreamUpstreamPeerFails), + metricNginxStreamUpstreamPeerHealthChecks: newMetricNginxStreamUpstreamPeerHealthChecks(mbc.Metrics.NginxStreamUpstreamPeerHealthChecks), + metricNginxStreamUpstreamPeerResponseTime: newMetricNginxStreamUpstreamPeerResponseTime(mbc.Metrics.NginxStreamUpstreamPeerResponseTime), + metricNginxStreamUpstreamPeerState: newMetricNginxStreamUpstreamPeerState(mbc.Metrics.NginxStreamUpstreamPeerState), + metricNginxStreamUpstreamPeerTtfbTime: newMetricNginxStreamUpstreamPeerTtfbTime(mbc.Metrics.NginxStreamUpstreamPeerTtfbTime), + metricNginxStreamUpstreamPeerUnavailable: newMetricNginxStreamUpstreamPeerUnavailable(mbc.Metrics.NginxStreamUpstreamPeerUnavailable), + metricNginxStreamUpstreamZombieCount: newMetricNginxStreamUpstreamZombieCount(mbc.Metrics.NginxStreamUpstreamZombieCount), + resourceAttributeIncludeFilter: make(map[string]filter.Filter), + resourceAttributeExcludeFilter: make(map[string]filter.Filter), } if mbc.ResourceAttributes.InstanceID.MetricsInclude != nil { mb.resourceAttributeIncludeFilter["instance.id"] = filter.CreateFilter(mbc.ResourceAttributes.InstanceID.MetricsInclude) @@ -3778,8 +3778,8 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { mb.metricNginxCacheMemoryUsage.emit(ils.Metrics()) mb.metricNginxCacheResponses.emit(ils.Metrics()) mb.metricNginxConfigReloads.emit(ils.Metrics()) - mb.metricNginxHTTPConn.emit(ils.Metrics()) - mb.metricNginxHTTPConnCount.emit(ils.Metrics()) + mb.metricNginxHTTPConnections.emit(ils.Metrics()) + mb.metricNginxHTTPConnectionsCount.emit(ils.Metrics()) mb.metricNginxHTTPLimitConnRequests.emit(ils.Metrics()) mb.metricNginxHTTPLimitReqRequests.emit(ils.Metrics()) mb.metricNginxHTTPRequestByteIo.emit(ils.Metrics()) @@ -3791,7 +3791,7 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { mb.metricNginxHTTPResponses.emit(ils.Metrics()) mb.metricNginxHTTPUpstreamKeepaliveCount.emit(ils.Metrics()) mb.metricNginxHTTPUpstreamPeerByteIo.emit(ils.Metrics()) - mb.metricNginxHTTPUpstreamPeerConnCount.emit(ils.Metrics()) + mb.metricNginxHTTPUpstreamPeerConnectionsCount.emit(ils.Metrics()) mb.metricNginxHTTPUpstreamPeerCount.emit(ils.Metrics()) mb.metricNginxHTTPUpstreamPeerFails.emit(ils.Metrics()) mb.metricNginxHTTPUpstreamPeerHeaderTime.emit(ils.Metrics()) @@ -3815,14 +3815,14 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { mb.metricNginxSslCertificateVerifyFailures.emit(ils.Metrics()) mb.metricNginxSslHandshakes.emit(ils.Metrics()) mb.metricNginxStreamByteIo.emit(ils.Metrics()) - mb.metricNginxStreamConnectionAccepted.emit(ils.Metrics()) - mb.metricNginxStreamConnectionDiscarded.emit(ils.Metrics()) - mb.metricNginxStreamConnectionProcessingCount.emit(ils.Metrics()) + mb.metricNginxStreamConnectionsAccepted.emit(ils.Metrics()) + mb.metricNginxStreamConnectionsDiscarded.emit(ils.Metrics()) + mb.metricNginxStreamConnectionsProcessingCount.emit(ils.Metrics()) mb.metricNginxStreamSessionStatus.emit(ils.Metrics()) mb.metricNginxStreamUpstreamPeerByteIo.emit(ils.Metrics()) - mb.metricNginxStreamUpstreamPeerConnCount.emit(ils.Metrics()) - mb.metricNginxStreamUpstreamPeerConnTime.emit(ils.Metrics()) - mb.metricNginxStreamUpstreamPeerConns.emit(ils.Metrics()) + mb.metricNginxStreamUpstreamPeerConnections.emit(ils.Metrics()) + mb.metricNginxStreamUpstreamPeerConnectionsCount.emit(ils.Metrics()) + mb.metricNginxStreamUpstreamPeerConnectionsTime.emit(ils.Metrics()) mb.metricNginxStreamUpstreamPeerCount.emit(ils.Metrics()) mb.metricNginxStreamUpstreamPeerFails.emit(ils.Metrics()) mb.metricNginxStreamUpstreamPeerHealthChecks.emit(ils.Metrics()) @@ -3887,14 +3887,14 @@ func (mb *MetricsBuilder) RecordNginxConfigReloadsDataPoint(ts pcommon.Timestamp mb.metricNginxConfigReloads.recordDataPoint(mb.startTime, ts, val) } -// 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()) +// RecordNginxHTTPConnectionsDataPoint adds a data point to nginx.http.connections metric. +func (mb *MetricsBuilder) RecordNginxHTTPConnectionsDataPoint(ts pcommon.Timestamp, val int64, nginxConnectionsOutcomeAttributeValue AttributeNginxConnectionsOutcome) { + mb.metricNginxHTTPConnections.recordDataPoint(mb.startTime, ts, val, nginxConnectionsOutcomeAttributeValue.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()) +// RecordNginxHTTPConnectionsCountDataPoint adds a data point to nginx.http.connections.count metric. +func (mb *MetricsBuilder) RecordNginxHTTPConnectionsCountDataPoint(ts pcommon.Timestamp, val int64, nginxConnectionsOutcomeAttributeValue AttributeNginxConnectionsOutcome) { + mb.metricNginxHTTPConnectionsCount.recordDataPoint(mb.startTime, ts, val, nginxConnectionsOutcomeAttributeValue.String()) } // RecordNginxHTTPLimitConnRequestsDataPoint adds a data point to nginx.http.limit_conn.requests metric. @@ -3952,9 +3952,9 @@ func (mb *MetricsBuilder) RecordNginxHTTPUpstreamPeerByteIoDataPoint(ts pcommon. mb.metricNginxHTTPUpstreamPeerByteIo.recordDataPoint(mb.startTime, ts, val, nginxByteIoDirectionAttributeValue.String(), nginxZoneNameAttributeValue, nginxUpstreamNameAttributeValue, nginxPeerAddressAttributeValue, nginxPeerNameAttributeValue) } -// RecordNginxHTTPUpstreamPeerConnCountDataPoint adds a data point to nginx.http.upstream.peer.conn.count metric. -func (mb *MetricsBuilder) RecordNginxHTTPUpstreamPeerConnCountDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { - mb.metricNginxHTTPUpstreamPeerConnCount.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue, nginxUpstreamNameAttributeValue, nginxPeerAddressAttributeValue, nginxPeerNameAttributeValue) +// RecordNginxHTTPUpstreamPeerConnectionsCountDataPoint adds a data point to nginx.http.upstream.peer.connections.count metric. +func (mb *MetricsBuilder) RecordNginxHTTPUpstreamPeerConnectionsCountDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { + mb.metricNginxHTTPUpstreamPeerConnectionsCount.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue, nginxUpstreamNameAttributeValue, nginxPeerAddressAttributeValue, nginxPeerNameAttributeValue) } // RecordNginxHTTPUpstreamPeerCountDataPoint adds a data point to nginx.http.upstream.peer.count metric. @@ -4072,19 +4072,19 @@ func (mb *MetricsBuilder) RecordNginxStreamByteIoDataPoint(ts pcommon.Timestamp, mb.metricNginxStreamByteIo.recordDataPoint(mb.startTime, ts, val, nginxByteIoDirectionAttributeValue.String(), nginxZoneNameAttributeValue) } -// RecordNginxStreamConnectionAcceptedDataPoint adds a data point to nginx.stream.connection.accepted metric. -func (mb *MetricsBuilder) RecordNginxStreamConnectionAcceptedDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { - mb.metricNginxStreamConnectionAccepted.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue) +// RecordNginxStreamConnectionsAcceptedDataPoint adds a data point to nginx.stream.connections.accepted metric. +func (mb *MetricsBuilder) RecordNginxStreamConnectionsAcceptedDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { + mb.metricNginxStreamConnectionsAccepted.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue) } -// RecordNginxStreamConnectionDiscardedDataPoint adds a data point to nginx.stream.connection.discarded metric. -func (mb *MetricsBuilder) RecordNginxStreamConnectionDiscardedDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { - mb.metricNginxStreamConnectionDiscarded.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue) +// RecordNginxStreamConnectionsDiscardedDataPoint adds a data point to nginx.stream.connections.discarded metric. +func (mb *MetricsBuilder) RecordNginxStreamConnectionsDiscardedDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { + mb.metricNginxStreamConnectionsDiscarded.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue) } -// RecordNginxStreamConnectionProcessingCountDataPoint adds a data point to nginx.stream.connection.processing.count metric. -func (mb *MetricsBuilder) RecordNginxStreamConnectionProcessingCountDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { - mb.metricNginxStreamConnectionProcessingCount.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue) +// RecordNginxStreamConnectionsProcessingCountDataPoint adds a data point to nginx.stream.connections.processing.count metric. +func (mb *MetricsBuilder) RecordNginxStreamConnectionsProcessingCountDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string) { + mb.metricNginxStreamConnectionsProcessingCount.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue) } // RecordNginxStreamSessionStatusDataPoint adds a data point to nginx.stream.session.status metric. @@ -4097,19 +4097,19 @@ func (mb *MetricsBuilder) RecordNginxStreamUpstreamPeerByteIoDataPoint(ts pcommo mb.metricNginxStreamUpstreamPeerByteIo.recordDataPoint(mb.startTime, ts, val, nginxByteIoDirectionAttributeValue.String(), nginxZoneNameAttributeValue, nginxUpstreamNameAttributeValue, nginxPeerAddressAttributeValue, nginxPeerNameAttributeValue) } -// RecordNginxStreamUpstreamPeerConnCountDataPoint adds a data point to nginx.stream.upstream.peer.conn.count metric. -func (mb *MetricsBuilder) RecordNginxStreamUpstreamPeerConnCountDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { - mb.metricNginxStreamUpstreamPeerConnCount.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue, nginxUpstreamNameAttributeValue, nginxPeerAddressAttributeValue, nginxPeerNameAttributeValue) +// RecordNginxStreamUpstreamPeerConnectionsDataPoint adds a data point to nginx.stream.upstream.peer.connections metric. +func (mb *MetricsBuilder) RecordNginxStreamUpstreamPeerConnectionsDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { + mb.metricNginxStreamUpstreamPeerConnections.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue, nginxUpstreamNameAttributeValue, nginxPeerAddressAttributeValue, nginxPeerNameAttributeValue) } -// RecordNginxStreamUpstreamPeerConnTimeDataPoint adds a data point to nginx.stream.upstream.peer.conn.time metric. -func (mb *MetricsBuilder) RecordNginxStreamUpstreamPeerConnTimeDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { - mb.metricNginxStreamUpstreamPeerConnTime.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue, nginxUpstreamNameAttributeValue, nginxPeerAddressAttributeValue, nginxPeerNameAttributeValue) +// RecordNginxStreamUpstreamPeerConnectionsCountDataPoint adds a data point to nginx.stream.upstream.peer.connections.count metric. +func (mb *MetricsBuilder) RecordNginxStreamUpstreamPeerConnectionsCountDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { + mb.metricNginxStreamUpstreamPeerConnectionsCount.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue, nginxUpstreamNameAttributeValue, nginxPeerAddressAttributeValue, nginxPeerNameAttributeValue) } -// RecordNginxStreamUpstreamPeerConnsDataPoint adds a data point to nginx.stream.upstream.peer.conns metric. -func (mb *MetricsBuilder) RecordNginxStreamUpstreamPeerConnsDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { - mb.metricNginxStreamUpstreamPeerConns.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue, nginxUpstreamNameAttributeValue, nginxPeerAddressAttributeValue, nginxPeerNameAttributeValue) +// RecordNginxStreamUpstreamPeerConnectionsTimeDataPoint adds a data point to nginx.stream.upstream.peer.connections.time metric. +func (mb *MetricsBuilder) RecordNginxStreamUpstreamPeerConnectionsTimeDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxUpstreamNameAttributeValue string, nginxPeerAddressAttributeValue string, nginxPeerNameAttributeValue string) { + mb.metricNginxStreamUpstreamPeerConnectionsTime.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue, nginxUpstreamNameAttributeValue, nginxPeerAddressAttributeValue, nginxPeerNameAttributeValue) } // RecordNginxStreamUpstreamPeerCountDataPoint adds a data point to nginx.stream.upstream.peer.count metric. diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go index f12924e8e0..ceb8801409 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go @@ -90,11 +90,11 @@ func TestMetricsBuilder(t *testing.T) { defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxHTTPConnDataPoint(ts, 1, AttributeNginxConnOutcomeACCEPTED) + mb.RecordNginxHTTPConnectionsDataPoint(ts, 1, AttributeNginxConnectionsOutcomeACCEPTED) defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxHTTPConnCountDataPoint(ts, 1, AttributeNginxConnOutcomeACCEPTED) + mb.RecordNginxHTTPConnectionsCountDataPoint(ts, 1, AttributeNginxConnectionsOutcomeACCEPTED) defaultMetricsCount++ allMetricsCount++ @@ -142,7 +142,7 @@ func TestMetricsBuilder(t *testing.T) { defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxHTTPUpstreamPeerConnCountDataPoint(ts, 1, "nginx.zone.name-val", "nginx.upstream.name-val", "nginx.peer.address-val", "nginx.peer.name-val") + mb.RecordNginxHTTPUpstreamPeerConnectionsCountDataPoint(ts, 1, "nginx.zone.name-val", "nginx.upstream.name-val", "nginx.peer.address-val", "nginx.peer.name-val") defaultMetricsCount++ allMetricsCount++ @@ -238,15 +238,15 @@ func TestMetricsBuilder(t *testing.T) { defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxStreamConnectionAcceptedDataPoint(ts, 1, "nginx.zone.name-val") + mb.RecordNginxStreamConnectionsAcceptedDataPoint(ts, 1, "nginx.zone.name-val") defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxStreamConnectionDiscardedDataPoint(ts, 1, "nginx.zone.name-val") + mb.RecordNginxStreamConnectionsDiscardedDataPoint(ts, 1, "nginx.zone.name-val") defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxStreamConnectionProcessingCountDataPoint(ts, 1, "nginx.zone.name-val") + mb.RecordNginxStreamConnectionsProcessingCountDataPoint(ts, 1, "nginx.zone.name-val") defaultMetricsCount++ allMetricsCount++ @@ -258,15 +258,15 @@ func TestMetricsBuilder(t *testing.T) { defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxStreamUpstreamPeerConnCountDataPoint(ts, 1, "nginx.zone.name-val", "nginx.upstream.name-val", "nginx.peer.address-val", "nginx.peer.name-val") + mb.RecordNginxStreamUpstreamPeerConnectionsDataPoint(ts, 1, "nginx.zone.name-val", "nginx.upstream.name-val", "nginx.peer.address-val", "nginx.peer.name-val") defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxStreamUpstreamPeerConnTimeDataPoint(ts, 1, "nginx.zone.name-val", "nginx.upstream.name-val", "nginx.peer.address-val", "nginx.peer.name-val") + mb.RecordNginxStreamUpstreamPeerConnectionsCountDataPoint(ts, 1, "nginx.zone.name-val", "nginx.upstream.name-val", "nginx.peer.address-val", "nginx.peer.name-val") defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxStreamUpstreamPeerConnsDataPoint(ts, 1, "nginx.zone.name-val", "nginx.upstream.name-val", "nginx.peer.address-val", "nginx.peer.name-val") + mb.RecordNginxStreamUpstreamPeerConnectionsTimeDataPoint(ts, 1, "nginx.zone.name-val", "nginx.upstream.name-val", "nginx.peer.address-val", "nginx.peer.name-val") defaultMetricsCount++ allMetricsCount++ @@ -409,9 +409,9 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, ts, dp.Timestamp()) assert.Equal(t, pmetric.NumberDataPointValueTypeInt, dp.ValueType()) assert.Equal(t, int64(1), dp.IntValue()) - 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 + case "nginx.http.connections": + assert.False(t, validatedMetrics["nginx.http.connections"], "Found a duplicate in the metrics slice: nginx.http.connections") + validatedMetrics["nginx.http.connections"] = 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()) @@ -423,12 +423,12 @@ func TestMetricsBuilder(t *testing.T) { 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") + attrVal, ok := dp.Attributes().Get("nginx.connections.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 + case "nginx.http.connections.count": + assert.False(t, validatedMetrics["nginx.http.connections.count"], "Found a duplicate in the metrics slice: nginx.http.connections.count") + validatedMetrics["nginx.http.connections.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()) @@ -438,7 +438,7 @@ func TestMetricsBuilder(t *testing.T) { 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") + attrVal, ok := dp.Attributes().Get("nginx.connections.outcome") assert.True(t, ok) assert.EqualValues(t, "ACCEPTED", attrVal.Str()) case "nginx.http.limit_conn.requests": @@ -664,9 +664,9 @@ func TestMetricsBuilder(t *testing.T) { attrVal, ok = dp.Attributes().Get("nginx.peer.name") assert.True(t, ok) assert.EqualValues(t, "nginx.peer.name-val", attrVal.Str()) - case "nginx.http.upstream.peer.conn.count": - assert.False(t, validatedMetrics["nginx.http.upstream.peer.conn.count"], "Found a duplicate in the metrics slice: nginx.http.upstream.peer.conn.count") - validatedMetrics["nginx.http.upstream.peer.conn.count"] = true + case "nginx.http.upstream.peer.connections.count": + assert.False(t, validatedMetrics["nginx.http.upstream.peer.connections.count"], "Found a duplicate in the metrics slice: nginx.http.upstream.peer.connections.count") + validatedMetrics["nginx.http.upstream.peer.connections.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 average number of active connections per HTTP upstream peer.", ms.At(i).Description()) @@ -1168,9 +1168,9 @@ func TestMetricsBuilder(t *testing.T) { attrVal, ok = dp.Attributes().Get("nginx.zone.name") assert.True(t, ok) assert.EqualValues(t, "nginx.zone.name-val", attrVal.Str()) - case "nginx.stream.connection.accepted": - assert.False(t, validatedMetrics["nginx.stream.connection.accepted"], "Found a duplicate in the metrics slice: nginx.stream.connection.accepted") - validatedMetrics["nginx.stream.connection.accepted"] = true + case "nginx.stream.connections.accepted": + assert.False(t, validatedMetrics["nginx.stream.connections.accepted"], "Found a duplicate in the metrics slice: nginx.stream.connections.accepted") + validatedMetrics["nginx.stream.connections.accepted"] = 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 accepted from clients.", ms.At(i).Description()) @@ -1185,9 +1185,9 @@ func TestMetricsBuilder(t *testing.T) { attrVal, ok := dp.Attributes().Get("nginx.zone.name") assert.True(t, ok) assert.EqualValues(t, "nginx.zone.name-val", attrVal.Str()) - case "nginx.stream.connection.discarded": - assert.False(t, validatedMetrics["nginx.stream.connection.discarded"], "Found a duplicate in the metrics slice: nginx.stream.connection.discarded") - validatedMetrics["nginx.stream.connection.discarded"] = true + case "nginx.stream.connections.discarded": + assert.False(t, validatedMetrics["nginx.stream.connections.discarded"], "Found a duplicate in the metrics slice: nginx.stream.connections.discarded") + validatedMetrics["nginx.stream.connections.discarded"] = true assert.Equal(t, pmetric.MetricTypeSum, ms.At(i).Type()) assert.Equal(t, 1, ms.At(i).Sum().DataPoints().Len()) assert.Equal(t, "Total number of connections completed without creating a session.", ms.At(i).Description()) @@ -1202,9 +1202,9 @@ func TestMetricsBuilder(t *testing.T) { attrVal, ok := dp.Attributes().Get("nginx.zone.name") assert.True(t, ok) assert.EqualValues(t, "nginx.zone.name-val", attrVal.Str()) - case "nginx.stream.connection.processing.count": - assert.False(t, validatedMetrics["nginx.stream.connection.processing.count"], "Found a duplicate in the metrics slice: nginx.stream.connection.processing.count") - validatedMetrics["nginx.stream.connection.processing.count"] = true + case "nginx.stream.connections.processing.count": + assert.False(t, validatedMetrics["nginx.stream.connections.processing.count"], "Found a duplicate in the metrics slice: nginx.stream.connections.processing.count") + validatedMetrics["nginx.stream.connections.processing.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 number of client connections that are currently being processed.", ms.At(i).Description()) @@ -1266,14 +1266,16 @@ func TestMetricsBuilder(t *testing.T) { attrVal, ok = dp.Attributes().Get("nginx.peer.name") assert.True(t, ok) assert.EqualValues(t, "nginx.peer.name-val", attrVal.Str()) - case "nginx.stream.upstream.peer.conn.count": - assert.False(t, validatedMetrics["nginx.stream.upstream.peer.conn.count"], "Found a duplicate in the metrics slice: nginx.stream.upstream.peer.conn.count") - validatedMetrics["nginx.stream.upstream.peer.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 Stream Upstream Peer connections.", ms.At(i).Description()) + case "nginx.stream.upstream.peer.connections": + assert.False(t, validatedMetrics["nginx.stream.upstream.peer.connections"], "Found a duplicate in the metrics slice: nginx.stream.upstream.peer.connections") + validatedMetrics["nginx.stream.upstream.peer.connections"] = 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 connections forwarded to this stream upstream peer.", ms.At(i).Description()) assert.Equal(t, "connections", ms.At(i).Unit()) - dp := ms.At(i).Gauge().DataPoints().At(0) + 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()) @@ -1290,13 +1292,13 @@ func TestMetricsBuilder(t *testing.T) { attrVal, ok = dp.Attributes().Get("nginx.peer.name") assert.True(t, ok) assert.EqualValues(t, "nginx.peer.name-val", attrVal.Str()) - case "nginx.stream.upstream.peer.conn.time": - assert.False(t, validatedMetrics["nginx.stream.upstream.peer.conn.time"], "Found a duplicate in the metrics slice: nginx.stream.upstream.peer.conn.time") - validatedMetrics["nginx.stream.upstream.peer.conn.time"] = true + case "nginx.stream.upstream.peer.connections.count": + assert.False(t, validatedMetrics["nginx.stream.upstream.peer.connections.count"], "Found a duplicate in the metrics slice: nginx.stream.upstream.peer.connections.count") + validatedMetrics["nginx.stream.upstream.peer.connections.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 average time to connect to the stream upstream peer.", ms.At(i).Description()) - assert.Equal(t, "ms", ms.At(i).Unit()) + assert.Equal(t, "The current number of Stream Upstream Peer 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()) @@ -1314,16 +1316,14 @@ func TestMetricsBuilder(t *testing.T) { attrVal, ok = dp.Attributes().Get("nginx.peer.name") assert.True(t, ok) assert.EqualValues(t, "nginx.peer.name-val", attrVal.Str()) - case "nginx.stream.upstream.peer.conns": - assert.False(t, validatedMetrics["nginx.stream.upstream.peer.conns"], "Found a duplicate in the metrics slice: nginx.stream.upstream.peer.conns") - validatedMetrics["nginx.stream.upstream.peer.conns"] = 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 connections forwarded to this stream upstream peer.", 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) + case "nginx.stream.upstream.peer.connections.time": + assert.False(t, validatedMetrics["nginx.stream.upstream.peer.connections.time"], "Found a duplicate in the metrics slice: nginx.stream.upstream.peer.connections.time") + validatedMetrics["nginx.stream.upstream.peer.connections.time"] = true + assert.Equal(t, pmetric.MetricTypeGauge, ms.At(i).Type()) + assert.Equal(t, 1, ms.At(i).Gauge().DataPoints().Len()) + assert.Equal(t, "The average time to connect to the stream upstream peer.", ms.At(i).Description()) + assert.Equal(t, "ms", 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()) diff --git a/internal/collector/nginxplusreceiver/internal/metadata/testdata/config.yaml b/internal/collector/nginxplusreceiver/internal/metadata/testdata/config.yaml index 148884fdbc..7bb1e116b0 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/testdata/config.yaml +++ b/internal/collector/nginxplusreceiver/internal/metadata/testdata/config.yaml @@ -11,9 +11,9 @@ all_set: enabled: true nginx.config.reloads: enabled: true - nginx.http.conn: + nginx.http.connections: enabled: true - nginx.http.conn.count: + nginx.http.connections.count: enabled: true nginx.http.limit_conn.requests: enabled: true @@ -37,7 +37,7 @@ all_set: enabled: true nginx.http.upstream.peer.byte.io: enabled: true - nginx.http.upstream.peer.conn.count: + nginx.http.upstream.peer.connections.count: enabled: true nginx.http.upstream.peer.count: enabled: true @@ -85,21 +85,21 @@ all_set: enabled: true nginx.stream.byte.io: enabled: true - nginx.stream.connection.accepted: + nginx.stream.connections.accepted: enabled: true - nginx.stream.connection.discarded: + nginx.stream.connections.discarded: enabled: true - nginx.stream.connection.processing.count: + nginx.stream.connections.processing.count: enabled: true nginx.stream.session.status: enabled: true nginx.stream.upstream.peer.byte.io: enabled: true - nginx.stream.upstream.peer.conn.count: + nginx.stream.upstream.peer.connections: enabled: true - nginx.stream.upstream.peer.conn.time: + nginx.stream.upstream.peer.connections.count: enabled: true - nginx.stream.upstream.peer.conns: + nginx.stream.upstream.peer.connections.time: enabled: true nginx.stream.upstream.peer.count: enabled: true @@ -134,9 +134,9 @@ none_set: enabled: false nginx.config.reloads: enabled: false - nginx.http.conn: + nginx.http.connections: enabled: false - nginx.http.conn.count: + nginx.http.connections.count: enabled: false nginx.http.limit_conn.requests: enabled: false @@ -160,7 +160,7 @@ none_set: enabled: false nginx.http.upstream.peer.byte.io: enabled: false - nginx.http.upstream.peer.conn.count: + nginx.http.upstream.peer.connections.count: enabled: false nginx.http.upstream.peer.count: enabled: false @@ -208,21 +208,21 @@ none_set: enabled: false nginx.stream.byte.io: enabled: false - nginx.stream.connection.accepted: + nginx.stream.connections.accepted: enabled: false - nginx.stream.connection.discarded: + nginx.stream.connections.discarded: enabled: false - nginx.stream.connection.processing.count: + nginx.stream.connections.processing.count: enabled: false nginx.stream.session.status: enabled: false nginx.stream.upstream.peer.byte.io: enabled: false - nginx.stream.upstream.peer.conn.count: + nginx.stream.upstream.peer.connections: enabled: false - nginx.stream.upstream.peer.conn.time: + nginx.stream.upstream.peer.connections.count: enabled: false - nginx.stream.upstream.peer.conns: + nginx.stream.upstream.peer.connections.time: enabled: false nginx.stream.upstream.peer.count: enabled: false diff --git a/internal/collector/nginxplusreceiver/metadata.yaml b/internal/collector/nginxplusreceiver/metadata.yaml index 13d27868f3..98c9f4dd3a 100644 --- a/internal/collector/nginxplusreceiver/metadata.yaml +++ b/internal/collector/nginxplusreceiver/metadata.yaml @@ -128,7 +128,7 @@ attributes: nginx.slab.slot.limit: description: The upper limit for a slab slot, used as the identifier for the slot. type: int - nginx.conn.outcome: + nginx.connections.outcome: description: The outcome of the connection. type: string enum: @@ -149,7 +149,7 @@ metrics: monotonic: true aggregation_temporality: cumulative unit: "reloads" - nginx.http.conn: + nginx.http.connections: enabled: true description: The total number of connections. sum: @@ -158,15 +158,15 @@ metrics: aggregation_temporality: cumulative unit: "connections" attributes: - - nginx.conn.outcome - nginx.http.conn.count: + - nginx.connections.outcome + nginx.http.connections.count: enabled: true description: The current number of connections. gauge: value_type: int unit: "connections" attributes: - - nginx.conn.outcome + - nginx.connections.outcome nginx.http.requests.count: enabled: true description: The current number of client requests received from clients. @@ -322,7 +322,7 @@ metrics: - nginx.upstream.name - nginx.peer.address - nginx.peer.name - nginx.http.upstream.peer.conn.count: + nginx.http.upstream.peer.connections.count: enabled: true description: The average number of active connections per HTTP upstream peer. gauge: @@ -574,7 +574,7 @@ metrics: attributes: - nginx.byte.io.direction - nginx.zone.name - nginx.stream.connection.accepted: + nginx.stream.connections.accepted: enabled: true description: The total number of connections accepted from clients. sum: @@ -584,7 +584,7 @@ metrics: unit: "connections" attributes: - nginx.zone.name - nginx.stream.connection.discarded: + nginx.stream.connections.discarded: enabled: true description: Total number of connections completed without creating a session. sum: @@ -594,7 +594,7 @@ metrics: unit: "connections" attributes: - nginx.zone.name - nginx.stream.connection.processing.count: + nginx.stream.connections.processing.count: enabled: true description: The number of client connections that are currently being processed. gauge: @@ -627,7 +627,7 @@ metrics: - nginx.upstream.name - nginx.peer.address - nginx.peer.name - nginx.stream.upstream.peer.conn.count: + nginx.stream.upstream.peer.connections.count: enabled: true description: The current number of Stream Upstream Peer connections. gauge: @@ -638,7 +638,7 @@ metrics: - nginx.upstream.name - nginx.peer.address - nginx.peer.name - nginx.stream.upstream.peer.conn.time: + nginx.stream.upstream.peer.connections.time: enabled: true description: The average time to connect to the stream upstream peer. gauge: @@ -649,7 +649,7 @@ metrics: - nginx.upstream.name - nginx.peer.address - nginx.peer.name - nginx.stream.upstream.peer.conns: + nginx.stream.upstream.peer.connections: enabled: true description: The total number of client connections forwarded to this stream upstream peer. sum: diff --git a/internal/collector/nginxplusreceiver/scraper.go b/internal/collector/nginxplusreceiver/scraper.go index d2cdc9e8ad..4911f49b5e 100644 --- a/internal/collector/nginxplusreceiver/scraper.go +++ b/internal/collector/nginxplusreceiver/scraper.go @@ -7,7 +7,10 @@ package nginxplusreceiver import ( "context" "fmt" + "net" + "net/http" "strconv" + "strings" "time" "go.uber.org/zap" @@ -43,14 +46,20 @@ func newNginxPlusScraper( settings receiver.Settings, cfg *Config, ) (*nginxPlusScraper, error) { + endpoint := strings.TrimPrefix(cfg.APIDetails.URL, "unix:") logger := settings.Logger logger.Info("Creating NGINX Plus scraper") + httpClient := http.DefaultClient mb := metadata.NewMetricsBuilder(cfg.MetricsBuilderConfig, settings) rb := mb.NewResourceBuilder() - plusClient, err := plusapi.NewNginxClient(cfg.Endpoint, - plusapi.WithMaxAPIVersion(), + if strings.HasPrefix(cfg.APIDetails.Listen, "unix:") { + httpClient = socketClient(strings.TrimPrefix(cfg.APIDetails.Listen, "unix:")) + } + + plusClient, err := plusapi.NewNginxClient(endpoint, + plusapi.WithMaxAPIVersion(), plusapi.WithHTTPClient(httpClient), ) if err != nil { return nil, err @@ -89,22 +98,26 @@ func (nps *nginxPlusScraper) recordMetrics(stats *plusapi.Stats) { nps.mb.RecordNginxConfigReloadsDataPoint(now, int64(stats.NginxInfo.Generation)) // Connections - nps.mb.RecordNginxHTTPConnDataPoint( + nps.mb.RecordNginxHTTPConnectionsDataPoint( now, int64(stats.Connections.Accepted), - metadata.AttributeNginxConnOutcomeACCEPTED, + metadata.AttributeNginxConnectionsOutcomeACCEPTED, ) - nps.mb.RecordNginxHTTPConnDataPoint( + nps.mb.RecordNginxHTTPConnectionsDataPoint( now, int64(stats.Connections.Dropped), - metadata.AttributeNginxConnOutcomeDROPPED, + metadata.AttributeNginxConnectionsOutcomeDROPPED, ) - nps.mb.RecordNginxHTTPConnCountDataPoint( + nps.mb.RecordNginxHTTPConnectionsCountDataPoint( now, int64(stats.Connections.Active), - metadata.AttributeNginxConnOutcomeACTIVE, + metadata.AttributeNginxConnectionsOutcomeACTIVE, + ) + nps.mb.RecordNginxHTTPConnectionsCountDataPoint( + now, + int64(stats.Connections.Idle), + metadata.AttributeNginxConnectionsOutcomeIDLE, ) - nps.mb.RecordNginxHTTPConnCountDataPoint(now, int64(stats.Connections.Idle), metadata.AttributeNginxConnOutcomeIDLE) // HTTP Requests nps.mb.RecordNginxHTTPRequestsDataPoint(now, int64(stats.HTTPRequests.Total), "", 0) @@ -134,9 +147,9 @@ func (nps *nginxPlusScraper) recordStreamMetrics(stats *plusapi.Stats, now pcomm metadata.AttributeNginxByteIoDirectionTX, name, ) - nps.mb.RecordNginxStreamConnectionAcceptedDataPoint(now, int64(streamServerZone.Connections), name) - nps.mb.RecordNginxStreamConnectionDiscardedDataPoint(now, int64(streamServerZone.Discarded), name) - nps.mb.RecordNginxStreamConnectionProcessingCountDataPoint(now, int64(streamServerZone.Processing), name) + nps.mb.RecordNginxStreamConnectionsAcceptedDataPoint(now, int64(streamServerZone.Connections), name) + nps.mb.RecordNginxStreamConnectionsDiscardedDataPoint(now, int64(streamServerZone.Discarded), name) + nps.mb.RecordNginxStreamConnectionsProcessingCountDataPoint(now, int64(streamServerZone.Processing), name) nps.mb.RecordNginxStreamSessionStatusDataPoint( now, int64(streamServerZone.Sessions.Sessions2xx), @@ -180,7 +193,7 @@ func (nps *nginxPlusScraper) recordStreamMetrics(stats *plusapi.Stats, now pcomm peer.Server, peer.Name, ) - nps.mb.RecordNginxStreamUpstreamPeerConnCountDataPoint( + nps.mb.RecordNginxStreamUpstreamPeerConnectionsCountDataPoint( now, int64(peer.Active), upstream.Zone, @@ -188,7 +201,7 @@ func (nps *nginxPlusScraper) recordStreamMetrics(stats *plusapi.Stats, now pcomm peer.Server, peer.Name, ) - nps.mb.RecordNginxStreamUpstreamPeerConnTimeDataPoint( + nps.mb.RecordNginxStreamUpstreamPeerConnectionsTimeDataPoint( now, int64(peer.ConnectTime), upstream.Zone, @@ -196,7 +209,8 @@ func (nps *nginxPlusScraper) recordStreamMetrics(stats *plusapi.Stats, now pcomm peer.Server, peer.Name, ) - nps.mb.RecordNginxStreamUpstreamPeerConnsDataPoint( + + nps.mb.RecordNginxStreamUpstreamPeerConnectionsDataPoint( now, int64(peer.Connections), upstream.Zone, @@ -486,7 +500,7 @@ func (nps *nginxPlusScraper) recordHTTPUpstreamPeerMetrics(stats *plusapi.Stats, peer.Name, ) - nps.mb.RecordNginxHTTPUpstreamPeerConnCountDataPoint( + nps.mb.RecordNginxHTTPUpstreamPeerConnectionsCountDataPoint( now, int64(peer.Active), upstream.Zone, @@ -989,6 +1003,16 @@ func (nps *nginxPlusScraper) recordCacheMetrics(stats *plusapi.Stats, now pcommo } } +func socketClient(socketPath string) *http.Client { + return &http.Client{ + Transport: &http.Transport{ + DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { + return net.Dial("unix", socketPath) + }, + }, + } +} + func (nps *nginxPlusScraper) Shutdown(ctx context.Context) error { return nil } diff --git a/internal/collector/nginxplusreceiver/scraper_test.go b/internal/collector/nginxplusreceiver/scraper_test.go index a10d1117af..e60ec747bf 100644 --- a/internal/collector/nginxplusreceiver/scraper_test.go +++ b/internal/collector/nginxplusreceiver/scraper_test.go @@ -24,7 +24,7 @@ func TestScraper(t *testing.T) { cfg, ok := createDefaultConfig().(*Config) assert.True(t, ok) - cfg.Endpoint = nginxPlusMock.URL + "/api" + cfg.APIDetails.URL = nginxPlusMock.URL + "/api" require.NoError(t, component.ValidateConfig(cfg)) scraper, err := newNginxPlusScraper(receivertest.NewNopSettings(), cfg) diff --git a/internal/collector/nginxplusreceiver/testdata/expected.yaml b/internal/collector/nginxplusreceiver/testdata/expected.yaml index acb9089ae1..c0f9cc2d77 100644 --- a/internal/collector/nginxplusreceiver/testdata/expected.yaml +++ b/internal/collector/nginxplusreceiver/testdata/expected.yaml @@ -15,35 +15,35 @@ resourceMetrics: isMonotonic: true unit: reloads - description: The total number of connections. - name: nginx.http.conn + name: nginx.http.connections sum: aggregationTemporality: 2 dataPoints: - asInt: "11" attributes: - - key: nginx.conn.outcome + - key: nginx.connections.outcome value: stringValue: ACCEPTED - asInt: "5" attributes: - - key: nginx.conn.outcome + - key: nginx.connections.outcome value: stringValue: DROPPED isMonotonic: true unit: connections - description: The current number of connections. - name: nginx.http.conn.count + name: nginx.http.connections.count gauge: aggregationTemporality: 2 dataPoints: - asInt: "1" attributes: - - key: nginx.conn.outcome + - key: nginx.connections.outcome value: stringValue: IDLE - asInt: "2" attributes: - - key: nginx.conn.outcome + - key: nginx.connections.outcome value: stringValue: ACTIVE isMonotonic: true @@ -592,7 +592,7 @@ resourceMetrics: isMonotonic: true unit: bytes - description: The average number of active connections per HTTP upstream peer. - name: nginx.http.upstream.peer.conn.count + name: nginx.http.upstream.peer.connections.count gauge: aggregationTemporality: 2 dataPoints: @@ -1636,7 +1636,7 @@ resourceMetrics: isMonotonic: true unit: bytes - description: The total number of connections accepted from clients. - name: nginx.stream.connection.accepted + name: nginx.stream.connections.accepted sum: aggregationTemporality: 2 dataPoints: @@ -1648,7 +1648,7 @@ resourceMetrics: isMonotonic: true unit: connections - description: Total number of connections completed without creating a session. - name: nginx.stream.connection.discarded + name: nginx.stream.connections.discarded sum: aggregationTemporality: 2 dataPoints: @@ -1660,7 +1660,7 @@ resourceMetrics: isMonotonic: true unit: connections - description: The number of client connections that are currently being processed. - name: nginx.stream.connection.processing.count + name: nginx.stream.connections.processing.count gauge: aggregationTemporality: 2 dataPoints: @@ -1752,7 +1752,7 @@ resourceMetrics: isMonotonic: true unit: bytes - description: The current number of Stream Upstream Peer connections. - name: nginx.stream.upstream.peer.conn.count + name: nginx.stream.upstream.peer.connections.count gauge: aggregationTemporality: 2 dataPoints: @@ -1773,7 +1773,7 @@ resourceMetrics: isMonotonic: true unit: connections - description: The average time to connect to the stream upstream peer. - name: nginx.stream.upstream.peer.conn.time + name: nginx.stream.upstream.peer.connections.time gauge: aggregationTemporality: 2 dataPoints: @@ -1794,7 +1794,7 @@ resourceMetrics: isMonotonic: true unit: ms - description: The total number of client connections forwarded to this stream upstream peer. - name: nginx.stream.upstream.peer.conns + name: nginx.stream.upstream.peer.connections sum: aggregationTemporality: 2 dataPoints: diff --git a/internal/collector/otel_collector_plugin.go b/internal/collector/otel_collector_plugin.go index d2879dbfbc..e91fbcee5e 100644 --- a/internal/collector/otel_collector_plugin.go +++ b/internal/collector/otel_collector_plugin.go @@ -17,6 +17,7 @@ import ( "github.com/nginx/agent/v3/api/grpc/mpi/v1" "github.com/nginx/agent/v3/internal/backoff" "github.com/nginx/agent/v3/internal/bus" + "github.com/nginx/agent/v3/internal/collector/types" "github.com/nginx/agent/v3/internal/config" "github.com/nginx/agent/v3/internal/model" "go.opentelemetry.io/collector/otelcol" @@ -30,7 +31,7 @@ const ( type ( // Collector The OTel collector plugin start an embedded OTel collector for metrics collection in the OTel format. Collector struct { - service *otelcol.Collector + service types.CollectorInterface cancel context.CancelFunc config *config.Config mu *sync.Mutex @@ -38,10 +39,16 @@ type ( } ) -var _ bus.Plugin = (*Collector)(nil) +var ( + _ bus.Plugin = (*Collector)(nil) + initMutex = &sync.Mutex{} +) // NewCollector is the constructor for the Collector plugin. func New(conf *config.Config) (*Collector, error) { + initMutex.Lock() + + defer initMutex.Unlock() if conf == nil { return nil, errors.New("nil agent config") } @@ -71,6 +78,13 @@ func New(conf *config.Config) (*Collector, error) { }, nil } +func (oc *Collector) GetState() otelcol.State { + oc.mu.Lock() + defer oc.mu.Unlock() + + return oc.service.GetState() +} + // Init initializes and starts the plugin func (oc *Collector) Init(ctx context.Context, mp bus.MessagePipeInterface) error { slog.InfoContext(ctx, "Starting OTel Collector plugin") @@ -106,13 +120,13 @@ func (oc *Collector) Init(ctx context.Context, mp bus.MessagePipeInterface) erro func (oc *Collector) processReceivers(ctx context.Context, receivers []config.OtlpReceiver) { for _, receiver := range receivers { if receiver.OtlpTLSConfig == nil { - slog.WarnContext(ctx, "OTEL receiver is configured without TLS. Connections are unencrypted.") + slog.WarnContext(ctx, "OTel receiver is configured without TLS. Connections are unencrypted.") continue } if receiver.OtlpTLSConfig.GenerateSelfSignedCert { slog.WarnContext(ctx, - "Self-signed certificate for OTEL receiver requested, "+ + "Self-signed certificate for OTel receiver requested, "+ "this is not recommended for production environments.", ) @@ -122,7 +136,7 @@ func (oc *Collector) processReceivers(ctx context.Context, receivers []config.Ot ) } } else { - slog.WarnContext(ctx, "OTEL receiver is configured without TLS. Connections are unencrypted.") + slog.WarnContext(ctx, "OTel receiver is configured without TLS. Connections are unencrypted.") } } } @@ -357,25 +371,33 @@ func (oc *Collector) restartCollector(ctx context.Context) { func (oc *Collector) checkForNewNginxReceivers(nginxConfigContext *model.NginxConfigContext) bool { nginxReceiverFound, reloadCollector := oc.updateExistingNginxPlusReceiver(nginxConfigContext) - if !nginxReceiverFound && nginxConfigContext.PlusAPI != "" { + if !nginxReceiverFound && nginxConfigContext.PlusAPI.URL != "" { oc.config.Collector.Receivers.NginxPlusReceivers = append( oc.config.Collector.Receivers.NginxPlusReceivers, config.NginxPlusReceiver{ InstanceID: nginxConfigContext.InstanceID, - PlusAPI: nginxConfigContext.PlusAPI, + PlusAPI: config.APIDetails{ + URL: nginxConfigContext.PlusAPI.URL, + Listen: nginxConfigContext.PlusAPI.Listen, + Location: nginxConfigContext.PlusAPI.Location, + }, }, ) reloadCollector = true - } else if nginxConfigContext.PlusAPI == "" { + } else if nginxConfigContext.PlusAPI.URL == "" { nginxReceiverFound, reloadCollector = oc.updateExistingNginxOSSReceiver(nginxConfigContext) - if !nginxReceiverFound && nginxConfigContext.StubStatus != "" { + if !nginxReceiverFound && nginxConfigContext.StubStatus.URL != "" { oc.config.Collector.Receivers.NginxReceivers = append( oc.config.Collector.Receivers.NginxReceivers, config.NginxReceiver{ InstanceID: nginxConfigContext.InstanceID, - StubStatus: nginxConfigContext.StubStatus, + StubStatus: config.APIDetails{ + URL: nginxConfigContext.StubStatus.URL, + Listen: nginxConfigContext.StubStatus.Listen, + Location: nginxConfigContext.StubStatus.Location, + }, AccessLogs: toConfigAccessLog(nginxConfigContext.AccessLogs), }, ) @@ -394,13 +416,13 @@ func (oc *Collector) updateExistingNginxPlusReceiver( if nginxPlusReceiver.InstanceID == nginxConfigContext.InstanceID { nginxReceiverFound = true - if nginxPlusReceiver.PlusAPI != nginxConfigContext.PlusAPI { + if nginxPlusReceiver.PlusAPI.URL != nginxConfigContext.PlusAPI.URL { oc.config.Collector.Receivers.NginxPlusReceivers = append( oc.config.Collector.Receivers.NginxPlusReceivers[:index], oc.config.Collector.Receivers.NginxPlusReceivers[index+1:]..., ) - if nginxConfigContext.PlusAPI != "" { - nginxPlusReceiver.PlusAPI = nginxConfigContext.PlusAPI + if nginxConfigContext.PlusAPI.URL != "" { + nginxPlusReceiver.PlusAPI.URL = nginxConfigContext.PlusAPI.URL oc.config.Collector.Receivers.NginxPlusReceivers = append( oc.config.Collector.Receivers.NginxPlusReceivers, nginxPlusReceiver, @@ -430,8 +452,12 @@ func (oc *Collector) updateExistingNginxOSSReceiver( oc.config.Collector.Receivers.NginxReceivers[:index], oc.config.Collector.Receivers.NginxReceivers[index+1:]..., ) - if nginxConfigContext.StubStatus != "" { - nginxReceiver.StubStatus = nginxConfigContext.StubStatus + if nginxConfigContext.StubStatus.URL != "" { + nginxReceiver.StubStatus = config.APIDetails{ + URL: nginxConfigContext.StubStatus.URL, + Listen: nginxConfigContext.StubStatus.Listen, + Location: nginxConfigContext.StubStatus.Location, + } nginxReceiver.AccessLogs = toConfigAccessLog(nginxConfigContext.AccessLogs) oc.config.Collector.Receivers.NginxReceivers = append( oc.config.Collector.Receivers.NginxReceivers, @@ -476,7 +502,7 @@ func (oc *Collector) updateResourceAttributes( } func isOSSReceiverChanged(nginxReceiver config.NginxReceiver, nginxConfigContext *model.NginxConfigContext) bool { - return nginxReceiver.StubStatus != nginxConfigContext.StubStatus || + return nginxReceiver.StubStatus.URL != nginxConfigContext.StubStatus.URL || len(nginxReceiver.AccessLogs) != len(nginxConfigContext.AccessLogs) } diff --git a/internal/collector/otel_collector_plugin_test.go b/internal/collector/otel_collector_plugin_test.go index 0c3a04b8a2..d686603f9b 100644 --- a/internal/collector/otel_collector_plugin_test.go +++ b/internal/collector/otel_collector_plugin_test.go @@ -7,10 +7,10 @@ package collector import ( "bytes" "context" + "errors" "fmt" "strings" "testing" - "time" "github.com/nginx/agent/v3/test/protos" "github.com/nginx/agent/v3/test/stub" @@ -19,6 +19,7 @@ import ( "go.opentelemetry.io/collector/otelcol" "github.com/nginx/agent/v3/internal/bus" + "github.com/nginx/agent/v3/internal/collector/types/typesfakes" "github.com/nginx/agent/v3/internal/config" "github.com/nginx/agent/v3/internal/model" "github.com/nginx/agent/v3/test/helpers" @@ -26,32 +27,113 @@ import ( ) func TestCollector_New(t *testing.T) { - conf := types.OTelConfig(t) - conf.Collector.Log.Path = "" + tests := []struct { + config *config.Config + expectedError error + name string + }{ + { + name: "Nil agent config", + config: nil, + expectedError: errors.New("nil agent config"), + }, + { + name: "Nil collector config", + config: &config.Config{ + Collector: nil, + }, + expectedError: errors.New("nil collector config"), + }, + { + name: "File write error", + config: &config.Config{ + Collector: &config.Collector{ + Log: &config.Log{Path: "/invalid/path"}, + }, + }, + expectedError: errors.New("open /invalid/path: no such file or directory"), + }, + { + name: "Successful initialization", + config: &config.Config{ + Collector: &config.Collector{ + Log: &config.Log{Path: "/tmp/test.log"}, + }, + }, + expectedError: nil, + }, + } - _, err := New(conf) - require.NoError(t, err, "NewCollector should not return an error with valid config") + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + collector, err := New(tt.config) + + if tt.expectedError != nil { + require.Error(t, err) + assert.Equal(t, tt.expectedError.Error(), err.Error()) + } else { + require.NoError(t, err) + assert.NotNil(t, collector) + } + }) + } } func TestCollector_Init(t *testing.T) { - conf := types.OTelConfig(t) - conf.Collector = &config.Collector{} + tests := []struct { + name string + expectedLog string + expectedError bool + }{ + { + name: "Default configured", + expectedError: false, + expectedLog: "", + }, + { + name: "No receivers set in config", + expectedError: true, + expectedLog: "No receivers configured for OTel Collector", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + conf := types.OTelConfig(t) - logBuf := &bytes.Buffer{} - stub.StubLoggerWith(logBuf) + var collector *Collector + var err error + logBuf := &bytes.Buffer{} + stub.StubLoggerWith(logBuf) - collector, err := New(conf) - require.NoError(t, err, "NewCollector should not return an error with valid config") + conf.Collector.Log = &config.Log{Path: "/tmp/test.log"} + + if tt.expectedError { + conf.Collector.Receivers = config.Receivers{} + } + + collector, err = New(conf) + require.NoError(t, err, "NewCollector should not return an error with valid config") + + collector.service = createFakeCollector() - initError := collector.Init(context.Background(), nil) - require.NoError(t, initError) + initError := collector.Init(context.Background(), nil) + require.NoError(t, initError) - if s := logBuf.String(); !strings.Contains(s, "No receivers configured for OTel Collector. "+ - "Waiting to discover a receiver before starting OTel collector.") { - t.Errorf("Unexpected log %s", s) + validateLog(t, tt.expectedLog, logBuf) + + require.NoError(t, collector.Close(context.TODO())) + }) } +} - assert.True(t, collector.stopped) +func validateLog(t *testing.T, expectedLog string, logBuf *bytes.Buffer) { + t.Helper() + + if expectedLog != "" { + if !strings.Contains(logBuf.String(), expectedLog) { + t.Errorf("Expected log to contain %q, but got %q", expectedLog, logBuf.String()) + } + } } func TestCollector_InitAndClose(t *testing.T) { @@ -68,31 +150,17 @@ func TestCollector_InitAndClose(t *testing.T) { require.NoError(t, err) require.NoError(t, collector.Init(ctx, messagePipe), "Init should not return an error") - assert.Eventually( - t, - func() bool { return collector.service.GetState() == otelcol.StateRunning }, - 2*time.Second, - 100*time.Millisecond, - ) + collector.service = createFakeCollector() + + assert.Equal(t, otelcol.StateRunning, collector.GetState()) require.NoError(t, collector.Close(ctx), "Close should not return an error") - assert.Eventually( - t, - func() bool { return collector.service.GetState() == otelcol.StateClosed }, - 2*time.Second, - 100*time.Millisecond, - ) + assert.Equal(t, otelcol.StateClosed, collector.GetState()) } // nolint: revive func TestCollector_ProcessNginxConfigUpdateTopic(t *testing.T) { - nginxPlusMock := helpers.NewMockNGINXPlusAPIServer(t) - defer nginxPlusMock.Close() - - conf := types.OTelConfig(t) - conf.Collector.Log.Path = "" - tests := []struct { name string message *bus.Message @@ -104,26 +172,24 @@ func TestCollector_ProcessNginxConfigUpdateTopic(t *testing.T) { Topic: bus.NginxConfigUpdateTopic, Data: &model.NginxConfigContext{ InstanceID: "123", - PlusAPI: fmt.Sprintf("%s/api", nginxPlusMock.URL), + PlusAPI: &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, }, }, receivers: config.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{}, - }, - }, - OtlpReceivers: types.OtlpReceivers(), + HostMetrics: nil, + OtlpReceivers: nil, NginxPlusReceivers: []config.NginxPlusReceiver{ { InstanceID: "123", - PlusAPI: fmt.Sprintf("%s/api", nginxPlusMock.URL), + PlusAPI: config.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, }, }, }, @@ -134,7 +200,16 @@ func TestCollector_ProcessNginxConfigUpdateTopic(t *testing.T) { Topic: bus.NginxConfigUpdateTopic, Data: &model.NginxConfigContext{ InstanceID: "123", - StubStatus: "http://test.com:8080/stub_status", + StubStatus: &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, + PlusAPI: &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, AccessLogs: []*model.AccessLog{ { Name: "/var/log/nginx/access.log", @@ -144,22 +219,16 @@ func TestCollector_ProcessNginxConfigUpdateTopic(t *testing.T) { }, }, receivers: config.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{}, - }, - }, - OtlpReceivers: types.OtlpReceivers(), + HostMetrics: nil, + OtlpReceivers: nil, NginxReceivers: []config.NginxReceiver{ { InstanceID: "123", - StubStatus: "http://test.com:8080/stub_status", + StubStatus: config.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, AccessLogs: []config.AccessLog{ { FilePath: "/var/log/nginx/access.log", @@ -168,59 +237,84 @@ func TestCollector_ProcessNginxConfigUpdateTopic(t *testing.T) { }, }, }, - NginxPlusReceivers: []config.NginxPlusReceiver{}, }, }, } for _, test := range tests { t.Run(test.name, func(tt *testing.T) { + nginxPlusMock := helpers.NewMockNGINXPlusAPIServer(t) + defer nginxPlusMock.Close() + + conf := types.OTelConfig(t) + + conf.Command = nil + + conf.Collector.Log.Path = "" + conf.Collector.Receivers.HostMetrics = nil + conf.Collector.Receivers.OtlpReceivers = nil + + if len(test.receivers.NginxPlusReceivers) == 1 { + apiDetails := config.APIDetails{ + URL: fmt.Sprintf("%s/api", nginxPlusMock.URL), + Listen: "", + Location: "", + } + + test.receivers.NginxPlusReceivers[0].PlusAPI = apiDetails + + model, ok := test.message.Data.(*model.NginxConfigContext) + if !ok { + t.Logf("Can't cast type") + t.Fail() + } + + model.PlusAPI.URL = apiDetails.URL + model.PlusAPI.Listen = apiDetails.Listen + model.PlusAPI.Location = apiDetails.Location + } else { + apiDetails := config.APIDetails{ + URL: fmt.Sprintf("%s/stub_status", nginxPlusMock.URL), + Listen: "", + Location: "", + } + test.receivers.NginxReceivers[0].StubStatus = apiDetails + + model, ok := test.message.Data.(*model.NginxConfigContext) + if !ok { + t.Logf("Can't cast type") + t.Fail() + } + + model.StubStatus.URL = apiDetails.URL + model.PlusAPI.Listen = apiDetails.Listen + model.PlusAPI.Location = apiDetails.Location + } + + conf.Collector.Processors.Batch = nil + conf.Collector.Processors.Attribute = nil + conf.Collector.Processors.Resource = nil + conf.Collector.Extensions.Health = nil + conf.Collector.Extensions.HeadersSetter = nil + conf.Collector.Exporters.PrometheusExporter = nil + collector, err := New(conf) require.NoError(tt, err, "NewCollector should not return an error with valid config") + collector.service = createFakeCollector() + ctx := context.Background() messagePipe := bus.NewMessagePipe(10) err = messagePipe.Register(10, []bus.Plugin{collector}) require.NoError(tt, err) require.NoError(tt, collector.Init(ctx, messagePipe), "Init should not return an error") - defer collector.Close(ctx) - - assert.Eventually( - tt, - func() bool { return collector.service.GetState() == otelcol.StateRunning }, - 5*time.Second, - 100*time.Millisecond, - ) collector.Process(ctx, test.message) - assert.Eventually( - tt, - func() bool { return collector.service.GetState() == otelcol.StateRunning }, - 5*time.Second, - 100*time.Millisecond, - ) - - if len(test.receivers.NginxPlusReceivers) > 0 { - assert.Eventually( - tt, - func() bool { return len(collector.config.Collector.Receivers.NginxPlusReceivers) > 0 }, - 5*time.Second, - 100*time.Millisecond, - ) - } - - if len(test.receivers.NginxReceivers) > 0 { - assert.Eventually( - tt, - func() bool { return len(collector.config.Collector.Receivers.NginxReceivers) > 0 }, - 5*time.Second, - 100*time.Millisecond, - ) - } - assert.Equal(tt, test.receivers, collector.config.Collector.Receivers) + + defer collector.Close(ctx) }) } } @@ -290,38 +384,21 @@ func TestCollector_ProcessResourceUpdateTopic(t *testing.T) { collector, err := New(conf) require.NoError(tt, err, "NewCollector should not return an error with valid config") + collector.service = createFakeCollector() + ctx := context.Background() messagePipe := bus.NewMessagePipe(10) err = messagePipe.Register(10, []bus.Plugin{collector}) require.NoError(tt, err) require.NoError(tt, collector.Init(ctx, messagePipe), "Init should not return an error") - defer collector.Close(ctx) - - assert.Eventually( - tt, - func() bool { - tt.Logf("Collector state is %+v", collector.service.GetState()) - return collector.service.GetState() == otelcol.StateRunning - }, - 5*time.Second, - 100*time.Millisecond, - ) collector.Process(ctx, test.message) - assert.Eventually( - tt, - func() bool { - tt.Logf("Collector state is %+v", collector.service.GetState()) - return collector.service.GetState() == otelcol.StateRunning - }, - 5*time.Second, - 100*time.Millisecond, - ) - assert.Equal(tt, test.processors, collector.config.Collector.Processors) assert.Equal(tt, test.headers, collector.config.Collector.Extensions.HeadersSetter.Headers) + + defer collector.Close(ctx) }) } } @@ -367,6 +444,8 @@ func TestCollector_ProcessResourceUpdateTopicFails(t *testing.T) { collector, err := New(conf) require.NoError(tt, err, "NewCollector should not return an error with valid config") + collector.service = createFakeCollector() + ctx := context.Background() messagePipe := bus.NewMessagePipe(10) err = messagePipe.Register(10, []bus.Plugin{collector}) @@ -375,28 +454,8 @@ func TestCollector_ProcessResourceUpdateTopicFails(t *testing.T) { require.NoError(tt, collector.Init(ctx, messagePipe), "Init should not return an error") defer collector.Close(ctx) - assert.Eventually( - tt, - func() bool { - tt.Logf("Collector state is %+v", collector.service.GetState()) - return collector.service.GetState() == otelcol.StateRunning - }, - 5*time.Second, - 100*time.Millisecond, - ) - collector.Process(ctx, test.message) - assert.Eventually( - tt, - func() bool { - tt.Logf("Collector state is %+v", collector.service.GetState()) - return collector.service.GetState() == otelcol.StateRunning - }, - 5*time.Second, - 100*time.Millisecond, - ) - assert.Equal(tt, config.Processors{ Batch: nil, @@ -423,7 +482,11 @@ func TestCollector_updateExistingNginxOSSReceiver(t *testing.T) { name: "Test 1: Existing NGINX Receiver", nginxConfigContext: &model.NginxConfigContext{ InstanceID: "123", - StubStatus: "http://new-test-host:8080/api", + StubStatus: &model.APIDetails{ + URL: "http://new-test-host:8080/api", + Listen: "", + Location: "", + }, AccessLogs: []*model.AccessLog{ { Name: "/etc/nginx/test.log", @@ -435,7 +498,11 @@ func TestCollector_updateExistingNginxOSSReceiver(t *testing.T) { NginxReceivers: []config.NginxReceiver{ { InstanceID: "123", - StubStatus: "http://test.com:8080/api", + StubStatus: config.APIDetails{ + URL: "http://test.com:8080/api", + Listen: "", + Location: "", + }, AccessLogs: []config.AccessLog{ { FilePath: "/etc/nginx/existing.log", @@ -449,7 +516,11 @@ func TestCollector_updateExistingNginxOSSReceiver(t *testing.T) { NginxReceivers: []config.NginxReceiver{ { InstanceID: "123", - StubStatus: "http://new-test-host:8080/api", + StubStatus: config.APIDetails{ + URL: "http://new-test-host:8080/api", + Listen: "", + Location: "", + }, AccessLogs: []config.AccessLog{ { FilePath: "/etc/nginx/test.log", @@ -464,13 +535,21 @@ func TestCollector_updateExistingNginxOSSReceiver(t *testing.T) { name: "Test 2: Removing NGINX Receiver", nginxConfigContext: &model.NginxConfigContext{ InstanceID: "123", - StubStatus: "", + StubStatus: &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, }, existingReceivers: config.Receivers{ NginxReceivers: []config.NginxReceiver{ { InstanceID: "123", - StubStatus: "http://test.com:8080/api", + StubStatus: config.APIDetails{ + URL: "http://test.com:8080/api", + Listen: "", + Location: "", + }, }, }, }, @@ -486,6 +565,8 @@ func TestCollector_updateExistingNginxOSSReceiver(t *testing.T) { collector, err := New(conf) require.NoError(tt, err, "NewCollector should not return an error with valid config") + collector.service = createFakeCollector() + nginxReceiverFound, reloadCollector := collector.updateExistingNginxOSSReceiver(test.nginxConfigContext) assert.True(tt, nginxReceiverFound) @@ -510,13 +591,21 @@ func TestCollector_updateExistingNginxPlusReceiver(t *testing.T) { name: "Test 1: Existing NGINX Plus Receiver", nginxConfigContext: &model.NginxConfigContext{ InstanceID: "123", - PlusAPI: "http://new-test-host:8080/api", + PlusAPI: &model.APIDetails{ + URL: "http://new-test-host:8080/api", + Listen: "", + Location: "", + }, }, existingReceivers: config.Receivers{ NginxPlusReceivers: []config.NginxPlusReceiver{ { InstanceID: "123", - PlusAPI: "http://test.com:8080/api", + PlusAPI: config.APIDetails{ + URL: "http://test.com:8080/api", + Listen: "", + Location: "", + }, }, }, }, @@ -524,7 +613,11 @@ func TestCollector_updateExistingNginxPlusReceiver(t *testing.T) { NginxPlusReceivers: []config.NginxPlusReceiver{ { InstanceID: "123", - PlusAPI: "http://new-test-host:8080/api", + PlusAPI: config.APIDetails{ + URL: "http://new-test-host:8080/api", + Listen: "", + Location: "", + }, }, }, }, @@ -533,13 +626,21 @@ func TestCollector_updateExistingNginxPlusReceiver(t *testing.T) { name: "Test 2: Removing NGINX Plus Receiver", nginxConfigContext: &model.NginxConfigContext{ InstanceID: "123", - PlusAPI: "", + PlusAPI: &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, }, existingReceivers: config.Receivers{ NginxPlusReceivers: []config.NginxPlusReceiver{ { InstanceID: "123", - PlusAPI: "http://test.com:8080/api", + PlusAPI: config.APIDetails{ + URL: "http://test.com:8080/api", + Listen: "", + Location: "", + }, }, }, }, @@ -555,6 +656,8 @@ func TestCollector_updateExistingNginxPlusReceiver(t *testing.T) { collector, err := New(conf) require.NoError(tt, err, "NewCollector should not return an error with valid config") + collector.service = createFakeCollector() + nginxReceiverFound, reloadCollector := collector.updateExistingNginxPlusReceiver(test.nginxConfigContext) assert.True(tt, nginxReceiverFound) @@ -608,6 +711,8 @@ func TestCollector_updateResourceAttributes(t *testing.T) { collector, err := New(conf) require.NoError(tt, err, "NewCollector should not return an error with valid config") + collector.service = createFakeCollector() + // set up Actions conf.Collector.Processors.Resource = &config.Resource{Attributes: test.setup} @@ -619,3 +724,15 @@ func TestCollector_updateResourceAttributes(t *testing.T) { }) } } + +func createFakeCollector() *typesfakes.FakeCollectorInterface { + fakeCollector := &typesfakes.FakeCollectorInterface{} + fakeCollector.RunStub = func(ctx context.Context) error { return nil } + fakeCollector.GetStateReturnsOnCall(0, otelcol.StateRunning) + fakeCollector.GetStateReturnsOnCall(1, otelcol.StateClosing) + fakeCollector.ShutdownCalls(func() { + fakeCollector.GetStateReturns(otelcol.StateClosed) + }) + + return fakeCollector +} diff --git a/internal/collector/otelcol.tmpl b/internal/collector/otelcol.tmpl index e6b3baca83..e91f11eb8d 100644 --- a/internal/collector/otelcol.tmpl +++ b/internal/collector/otelcol.tmpl @@ -59,7 +59,10 @@ receivers: {{- end }} {{- range .Receivers.NginxReceivers }} nginx/{{- .InstanceID -}}: - endpoint: "{{- .StubStatus -}}" + api_details: + url: "{{- .StubStatus.URL -}}" + listen: "{{- .StubStatus.Listen -}}" + location: "{{- .StubStatus.Location -}}" collection_interval: 10s {{- if gt (len .AccessLogs) 0 }} access_logs: @@ -71,7 +74,10 @@ receivers: {{- end }} {{- range .Receivers.NginxPlusReceivers }} nginxplus/{{- .InstanceID -}}: - endpoint: "{{- .PlusAPI -}}" + api_details: + url: "{{- .PlusAPI.URL -}}" + listen: "{{- .PlusAPI.Listen -}}" + location: "{{- .PlusAPI.Location -}}" collection_interval: 10s {{- end }} @@ -109,7 +115,9 @@ exporters: {{- range $index, $otlpExporter := .Exporters.OtlpExporters }} otlp/{{$index}}: endpoint: "{{ .Server.Host -}}:{{- .Server.Port }}" - compression: none + {{- if .Compression }} + compression: {{ .Compression }} + {{- end }} timeout: 10s retry_on_failure: enabled: true diff --git a/internal/collector/settings_test.go b/internal/collector/settings_test.go index a512a5bc26..e7946d7ff0 100644 --- a/internal/collector/settings_test.go +++ b/internal/collector/settings_test.go @@ -77,7 +77,11 @@ func TestTemplateWrite(t *testing.T) { } cfg.Collector.Receivers.NginxReceivers = append(cfg.Collector.Receivers.NginxReceivers, config.NginxReceiver{ InstanceID: "123", - StubStatus: "http://localhost:80/status", + StubStatus: config.APIDetails{ + URL: "http://localhost:80/status", + Location: "", + Listen: "", + }, AccessLogs: []config.AccessLog{ { LogFormat: accessLogFormat, @@ -115,6 +119,11 @@ func TestTemplateWrite(t *testing.T) { } cfg.Collector.Exporters.OtlpExporters[0].Authenticator = "headers_setter" + // nolint: lll + cfg.Collector.Exporters.OtlpExporters[0].Compression = types.AgentConfig().Collector.Exporters.OtlpExporters[0].Compression + cfg.Collector.Exporters.OtlpExporters[0].Server.Port = 1234 + cfg.Collector.Receivers.OtlpReceivers[0].Server.Port = 4317 + cfg.Collector.Extensions.Health.Server.Port = 1337 require.NotNil(t, cfg) diff --git a/internal/collector/types/collector.go b/internal/collector/types/collector.go new file mode 100644 index 0000000000..e92f54c296 --- /dev/null +++ b/internal/collector/types/collector.go @@ -0,0 +1,22 @@ +// 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 types + +import ( + "context" + + "go.opentelemetry.io/collector/otelcol" +) + +// CollectorInterface The high-level collector interface +type CollectorInterface interface { + Run(ctx context.Context) error + GetState() otelcol.State + Shutdown() +} + +// Ensure the original Collector struct implements your interface +var _ CollectorInterface = (*otelcol.Collector)(nil) diff --git a/internal/collector/types/mocks.go b/internal/collector/types/mocks.go new file mode 100644 index 0000000000..bdb44f6291 --- /dev/null +++ b/internal/collector/types/mocks.go @@ -0,0 +1,9 @@ +// 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 types + +//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6@v6.8.1 -generate +//counterfeiter:generate . CollectorInterface diff --git a/internal/collector/types/typesfakes/fake_collector_interface.go b/internal/collector/types/typesfakes/fake_collector_interface.go new file mode 100644 index 0000000000..cffd05e136 --- /dev/null +++ b/internal/collector/types/typesfakes/fake_collector_interface.go @@ -0,0 +1,208 @@ +// Code generated by counterfeiter. DO NOT EDIT. +package typesfakes + +import ( + "context" + "sync" + + "github.com/nginx/agent/v3/internal/collector/types" + "go.opentelemetry.io/collector/otelcol" +) + +type FakeCollectorInterface struct { + GetStateStub func() otelcol.State + getStateMutex sync.RWMutex + getStateArgsForCall []struct { + } + getStateReturns struct { + result1 otelcol.State + } + getStateReturnsOnCall map[int]struct { + result1 otelcol.State + } + RunStub func(context.Context) error + runMutex sync.RWMutex + runArgsForCall []struct { + arg1 context.Context + } + runReturns struct { + result1 error + } + runReturnsOnCall map[int]struct { + result1 error + } + ShutdownStub func() + shutdownMutex sync.RWMutex + shutdownArgsForCall []struct { + } + invocations map[string][][]interface{} + invocationsMutex sync.RWMutex +} + +func (fake *FakeCollectorInterface) GetState() otelcol.State { + fake.getStateMutex.Lock() + ret, specificReturn := fake.getStateReturnsOnCall[len(fake.getStateArgsForCall)] + fake.getStateArgsForCall = append(fake.getStateArgsForCall, struct { + }{}) + stub := fake.GetStateStub + fakeReturns := fake.getStateReturns + fake.recordInvocation("GetState", []interface{}{}) + fake.getStateMutex.Unlock() + if stub != nil { + return stub() + } + if specificReturn { + return ret.result1 + } + return fakeReturns.result1 +} + +func (fake *FakeCollectorInterface) GetStateCallCount() int { + fake.getStateMutex.RLock() + defer fake.getStateMutex.RUnlock() + return len(fake.getStateArgsForCall) +} + +func (fake *FakeCollectorInterface) GetStateCalls(stub func() otelcol.State) { + fake.getStateMutex.Lock() + defer fake.getStateMutex.Unlock() + fake.GetStateStub = stub +} + +func (fake *FakeCollectorInterface) GetStateReturns(result1 otelcol.State) { + fake.getStateMutex.Lock() + defer fake.getStateMutex.Unlock() + fake.GetStateStub = nil + fake.getStateReturns = struct { + result1 otelcol.State + }{result1} +} + +func (fake *FakeCollectorInterface) GetStateReturnsOnCall(i int, result1 otelcol.State) { + fake.getStateMutex.Lock() + defer fake.getStateMutex.Unlock() + fake.GetStateStub = nil + if fake.getStateReturnsOnCall == nil { + fake.getStateReturnsOnCall = make(map[int]struct { + result1 otelcol.State + }) + } + fake.getStateReturnsOnCall[i] = struct { + result1 otelcol.State + }{result1} +} + +func (fake *FakeCollectorInterface) Run(arg1 context.Context) error { + fake.runMutex.Lock() + ret, specificReturn := fake.runReturnsOnCall[len(fake.runArgsForCall)] + fake.runArgsForCall = append(fake.runArgsForCall, struct { + arg1 context.Context + }{arg1}) + stub := fake.RunStub + fakeReturns := fake.runReturns + fake.recordInvocation("Run", []interface{}{arg1}) + fake.runMutex.Unlock() + if stub != nil { + return stub(arg1) + } + if specificReturn { + return ret.result1 + } + return fakeReturns.result1 +} + +func (fake *FakeCollectorInterface) RunCallCount() int { + fake.runMutex.RLock() + defer fake.runMutex.RUnlock() + return len(fake.runArgsForCall) +} + +func (fake *FakeCollectorInterface) RunCalls(stub func(context.Context) error) { + fake.runMutex.Lock() + defer fake.runMutex.Unlock() + fake.RunStub = stub +} + +func (fake *FakeCollectorInterface) RunArgsForCall(i int) context.Context { + fake.runMutex.RLock() + defer fake.runMutex.RUnlock() + argsForCall := fake.runArgsForCall[i] + return argsForCall.arg1 +} + +func (fake *FakeCollectorInterface) RunReturns(result1 error) { + fake.runMutex.Lock() + defer fake.runMutex.Unlock() + fake.RunStub = nil + fake.runReturns = struct { + result1 error + }{result1} +} + +func (fake *FakeCollectorInterface) RunReturnsOnCall(i int, result1 error) { + fake.runMutex.Lock() + defer fake.runMutex.Unlock() + fake.RunStub = nil + if fake.runReturnsOnCall == nil { + fake.runReturnsOnCall = make(map[int]struct { + result1 error + }) + } + fake.runReturnsOnCall[i] = struct { + result1 error + }{result1} +} + +func (fake *FakeCollectorInterface) Shutdown() { + fake.shutdownMutex.Lock() + fake.shutdownArgsForCall = append(fake.shutdownArgsForCall, struct { + }{}) + stub := fake.ShutdownStub + fake.recordInvocation("Shutdown", []interface{}{}) + fake.shutdownMutex.Unlock() + if stub != nil { + fake.ShutdownStub() + } +} + +func (fake *FakeCollectorInterface) ShutdownCallCount() int { + fake.shutdownMutex.RLock() + defer fake.shutdownMutex.RUnlock() + return len(fake.shutdownArgsForCall) +} + +func (fake *FakeCollectorInterface) ShutdownCalls(stub func()) { + fake.shutdownMutex.Lock() + defer fake.shutdownMutex.Unlock() + fake.ShutdownStub = stub +} + +func (fake *FakeCollectorInterface) Invocations() map[string][][]interface{} { + fake.invocationsMutex.RLock() + defer fake.invocationsMutex.RUnlock() + fake.getStateMutex.RLock() + defer fake.getStateMutex.RUnlock() + fake.runMutex.RLock() + defer fake.runMutex.RUnlock() + fake.shutdownMutex.RLock() + defer fake.shutdownMutex.RUnlock() + copiedInvocations := map[string][][]interface{}{} + for key, value := range fake.invocations { + copiedInvocations[key] = value + } + return copiedInvocations +} + +func (fake *FakeCollectorInterface) recordInvocation(key string, args []interface{}) { + fake.invocationsMutex.Lock() + defer fake.invocationsMutex.Unlock() + if fake.invocations == nil { + fake.invocations = map[string][][]interface{}{} + } + if fake.invocations[key] == nil { + fake.invocations[key] = [][]interface{}{} + } + fake.invocations[key] = append(fake.invocations[key], args) +} + +var _ types.CollectorInterface = new(FakeCollectorInterface) diff --git a/internal/command/command_plugin_test.go b/internal/command/command_plugin_test.go index 6851195604..0481232f3f 100644 --- a/internal/command/command_plugin_test.go +++ b/internal/command/command_plugin_test.go @@ -12,6 +12,8 @@ import ( "testing" "time" + "github.com/nginx/agent/v3/internal/bus/busfakes" + mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" "github.com/nginx/agent/v3/internal/bus" "github.com/nginx/agent/v3/internal/command/commandfakes" @@ -48,7 +50,7 @@ func TestCommandPlugin_Subscriptions(t *testing.T) { func TestCommandPlugin_Init(t *testing.T) { ctx := context.Background() - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() fakeCommandService := &commandfakes.FakeCommandService{} commandPlugin := NewCommandPlugin(types.AgentConfig(), &grpcfakes.FakeGrpcConnectionInterface{}) @@ -67,7 +69,7 @@ func TestCommandPlugin_Init(t *testing.T) { func TestCommandPlugin_Process(t *testing.T) { ctx := context.Background() - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() fakeCommandService := &commandfakes.FakeCommandService{} commandPlugin := NewCommandPlugin(types.AgentConfig(), &grpcfakes.FakeGrpcConnectionInterface{}) @@ -147,7 +149,7 @@ func TestCommandPlugin_monitorSubscribeChannel(t *testing.T) { t.Run(test.name, func(tt *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() commandPlugin := NewCommandPlugin(types.AgentConfig(), &grpcfakes.FakeGrpcConnectionInterface{}) err := commandPlugin.Init(ctx, messagePipe) diff --git a/internal/config/config.go b/internal/config/config.go index b6df4f0bb1..4bd76679ca 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -524,7 +524,7 @@ func resolveProcessors() Processors { return processors } -// generate self-signed certificate for OTEL receiver +// generate self-signed certificate for OTel receiver // nolint: revive func handleSelfSignedCertificates(col *Collector) error { if col.Receivers.OtlpReceivers != nil { diff --git a/internal/config/config_test.go b/internal/config/config_test.go index ad58a7a287..9cfb9d36e6 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -354,7 +354,10 @@ func getAgentConfig() *Config { NginxReceivers: []NginxReceiver{ { InstanceID: "cd7b8911-c2c5-4daf-b311-dbead151d938", - StubStatus: "http://localhost:4321/status", + StubStatus: APIDetails{ + URL: "http://localhost:4321/status", + Listen: "", + }, AccessLogs: []AccessLog{ { LogFormat: accessLogFormat, diff --git a/internal/config/mapper.go b/internal/config/mapper.go new file mode 100644 index 0000000000..c9e85e6428 --- /dev/null +++ b/internal/config/mapper.go @@ -0,0 +1,82 @@ +// 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 ( + "log/slog" + + mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" +) + +// FromCommandProto maps the AgentConfig Command struct to the Command proto message +func FromCommandProto(config *mpi.CommandServer) *Command { + cmd := &Command{} + + // Map ServerSettings to the ServerConfig + if config.GetServer() != nil && config.GetServer().GetHost() != "" && config.GetServer().GetPort() != 0 { + cmd.Server = &ServerConfig{ + Host: config.GetServer().GetHost(), + Port: int(config.GetServer().GetPort()), + } + if config.GetServer().GetType() != mpi.ServerSettings_SERVER_SETTINGS_TYPE_UNDEFINED { + cmd.Server.Type = ServerType(config.GetServer().GetType()) + } + } else { + cmd.Server = nil + } + // Set Auth to be nil + cmd.Auth = nil + + // Map TLSSettings to TLSConfig + if config.GetTls() != nil { + cmd.TLS = &TLSConfig{ + Cert: config.GetTls().GetCert(), + Key: config.GetTls().GetKey(), + Ca: config.GetTls().GetCa(), + ServerName: config.GetTls().GetServerName(), + SkipVerify: config.GetTls().GetSkipVerify(), + } + if cmd.TLS.SkipVerify { + slog.Warn("Insecure setting SkipVerify, this tells the server to accept a certificate with any hostname.") + } + } else { + cmd.TLS = nil + } + + return cmd +} + +// ToCommandProto maps the AgentConfig Command struct back to the Command proto message +func ToCommandProto(cmd *Command) *mpi.CommandServer { + protoConfig := &mpi.CommandServer{} + + // Map ServerConfig to the ServerSettings + if cmd.Server != nil { + protoConfig.Server = &mpi.ServerSettings{ + Host: cmd.Server.Host, + Port: int32(cmd.Server.Port), + Type: mpi.ServerSettings_ServerType(cmd.Server.Type + 1), + } + } + + // Map AuthConfig to AuthSettings + if cmd.Auth != nil { + protoConfig.Auth = &mpi.AuthSettings{} + } + + // Map TLSConfig to TLSSettings + if cmd.TLS != nil { + protoConfig.Tls = &mpi.TLSSettings{ + Cert: cmd.TLS.Cert, + Key: cmd.TLS.Key, + Ca: cmd.TLS.Ca, + ServerName: cmd.TLS.ServerName, + SkipVerify: cmd.TLS.SkipVerify, + } + } + + return protoConfig +} diff --git a/internal/config/mapper_test.go b/internal/config/mapper_test.go new file mode 100644 index 0000000000..7b6e857986 --- /dev/null +++ b/internal/config/mapper_test.go @@ -0,0 +1,221 @@ +// 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 ( + "testing" + + mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" + "github.com/stretchr/testify/assert" +) + +func TestFromCommandProto(t *testing.T) { + tests := []struct { + protoConfig *mpi.CommandServer + expected *Command + name string + }{ + { + name: "Test 1: Valid input with all fields", + protoConfig: &mpi.CommandServer{ + Server: &mpi.ServerSettings{ + Host: getAgentConfig().Command.Server.Host, + Port: int32(getAgentConfig().Command.Server.Port), + Type: 1, + }, + Auth: &mpi.AuthSettings{}, + Tls: &mpi.TLSSettings{ + Cert: getAgentConfig().Command.TLS.Cert, + Key: getAgentConfig().Command.TLS.Key, + Ca: getAgentConfig().Command.TLS.Ca, + ServerName: getAgentConfig().Command.TLS.ServerName, + SkipVerify: getAgentConfig().Command.TLS.SkipVerify, + }, + }, + expected: &Command{ + Server: getAgentConfig().Command.Server, + Auth: nil, + TLS: getAgentConfig().Command.TLS, + }, + }, + { + name: "Test 2: Missing server", + protoConfig: &mpi.CommandServer{ + Auth: &mpi.AuthSettings{}, + Tls: &mpi.TLSSettings{ + Cert: getAgentConfig().Command.TLS.Cert, + Key: getAgentConfig().Command.TLS.Key, + Ca: getAgentConfig().Command.TLS.Ca, + ServerName: getAgentConfig().Command.TLS.ServerName, + SkipVerify: getAgentConfig().Command.TLS.SkipVerify, + }, + }, + expected: &Command{ + Server: nil, + Auth: nil, + TLS: getAgentConfig().Command.TLS, + }, + }, + { + name: "Test 3: Missing auth", + protoConfig: &mpi.CommandServer{ + Server: &mpi.ServerSettings{ + Host: getAgentConfig().Command.Server.Host, + Port: int32(getAgentConfig().Command.Server.Port), + Type: 1, // gRPC + }, + Tls: &mpi.TLSSettings{ + Cert: getAgentConfig().Command.TLS.Cert, + Key: getAgentConfig().Command.TLS.Key, + Ca: getAgentConfig().Command.TLS.Ca, + ServerName: getAgentConfig().Command.TLS.ServerName, + SkipVerify: getAgentConfig().Command.TLS.SkipVerify, + }, + }, + expected: &Command{ + Server: getAgentConfig().Command.Server, + Auth: nil, + TLS: getAgentConfig().Command.TLS, + }, + }, + { + name: "Test 4: Missing TLS", + protoConfig: &mpi.CommandServer{ + Server: &mpi.ServerSettings{ + Host: getAgentConfig().Command.Server.Host, + Port: int32(getAgentConfig().Command.Server.Port), + Type: 1, // Change to HTTP when supported + }, + Auth: &mpi.AuthSettings{}, + }, + expected: &Command{ + Server: getAgentConfig().Command.Server, + Auth: nil, + TLS: nil, + }, + }, + { + name: "Test 5: Empty input", + protoConfig: &mpi.CommandServer{}, + expected: &Command{ + Server: nil, + Auth: nil, + TLS: nil, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + config := FromCommandProto(tt.protoConfig) + assert.Equal(t, tt.expected, config) + }) + } +} + +func TestToCommandProto(t *testing.T) { + tests := []struct { + cmd *Command + expected *mpi.CommandServer + name string + }{ + { + name: "Test 1: Valid input with all fields", + cmd: &Command{ + Server: getAgentConfig().Command.Server, + Auth: getAgentConfig().Command.Auth, + TLS: getAgentConfig().Command.TLS, + }, + expected: &mpi.CommandServer{ + Server: &mpi.ServerSettings{ + Host: getAgentConfig().Command.Server.Host, + Port: int32(getAgentConfig().Command.Server.Port), + Type: 2, + }, + Auth: &mpi.AuthSettings{}, + Tls: &mpi.TLSSettings{ + Cert: getAgentConfig().Command.TLS.Cert, + Key: getAgentConfig().Command.TLS.Key, + Ca: getAgentConfig().Command.TLS.Ca, + ServerName: getAgentConfig().Command.TLS.ServerName, + SkipVerify: getAgentConfig().Command.TLS.SkipVerify, + }, + }, + }, + { + name: "Test 2: Missing server", + cmd: &Command{ + Server: nil, + Auth: getAgentConfig().Command.Auth, + TLS: getAgentConfig().Command.TLS, + }, + expected: &mpi.CommandServer{ + Server: nil, + Auth: &mpi.AuthSettings{}, + Tls: &mpi.TLSSettings{ + Cert: getAgentConfig().Command.TLS.Cert, + Key: getAgentConfig().Command.TLS.Key, + Ca: getAgentConfig().Command.TLS.Ca, + ServerName: getAgentConfig().Command.TLS.ServerName, + SkipVerify: getAgentConfig().Command.TLS.SkipVerify, + }, + }, + }, + { + name: "Test 3: Missing auth", + cmd: &Command{ + Server: getAgentConfig().Command.Server, + Auth: nil, + TLS: getAgentConfig().Command.TLS, + }, + expected: &mpi.CommandServer{ + Server: &mpi.ServerSettings{ + Host: getAgentConfig().Command.Server.Host, + Port: int32(getAgentConfig().Command.Server.Port), + Type: 2, // gRPC + }, + Tls: &mpi.TLSSettings{ + Cert: getAgentConfig().Command.TLS.Cert, + Key: getAgentConfig().Command.TLS.Key, + Ca: getAgentConfig().Command.TLS.Ca, + ServerName: getAgentConfig().Command.TLS.ServerName, + SkipVerify: getAgentConfig().Command.TLS.SkipVerify, + }, + }, + }, + { + name: "Test 4: Missing TLS", + cmd: &Command{ + Server: getAgentConfig().Command.Server, + Auth: getAgentConfig().Command.Auth, + TLS: nil, + }, + expected: &mpi.CommandServer{ + Server: &mpi.ServerSettings{ + Host: getAgentConfig().Command.Server.Host, + Port: int32(getAgentConfig().Command.Server.Port), + Type: 2, + }, + Auth: &mpi.AuthSettings{}, + }, + }, + { + name: "Test 5: Empty input", + cmd: &Command{}, + expected: &mpi.CommandServer{ + Server: nil, + Auth: nil, + Tls: nil, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + protoConfig := ToCommandProto(tt.cmd) + assert.Equal(t, tt.expected, protoConfig) + }) + } +} diff --git a/internal/config/types.go b/internal/config/types.go index 0e36ae0819..f532dad376 100644 --- a/internal/config/types.go +++ b/internal/config/types.go @@ -91,6 +91,7 @@ type ( OtlpExporter struct { Server *ServerConfig `yaml:"-" mapstructure:"server"` TLS *TLSConfig `yaml:"-" mapstructure:"tls"` + Compression string `yaml:"-" mapstructure:"compression"` Authenticator string `yaml:"-" mapstructure:"authenticator"` } @@ -173,18 +174,24 @@ type ( NginxReceiver struct { InstanceID string `yaml:"-" mapstructure:"instance_id"` - StubStatus string `yaml:"-" mapstructure:"stub_status"` + StubStatus APIDetails `yaml:"-" mapstructure:"api_details"` AccessLogs []AccessLog `yaml:"-" mapstructure:"access_logs"` } + APIDetails struct { + URL string `yaml:"-" mapstructure:"url"` + Listen string `yaml:"-" mapstructure:"listen"` + Location string `yaml:"-" mapstructure:"location"` + } + AccessLog struct { FilePath string `yaml:"-" mapstructure:"file_path"` LogFormat string `yaml:"-" mapstructure:"log_format"` } NginxPlusReceiver struct { - InstanceID string `yaml:"-" mapstructure:"instance_id"` - PlusAPI string `yaml:"-" mapstructure:"plus_api"` + InstanceID string `yaml:"-" mapstructure:"instance_id"` + PlusAPI APIDetails `yaml:"-" mapstructure:"api_details"` } HostMetrics struct { diff --git a/internal/datasource/cert/cert.go b/internal/datasource/cert/cert.go new file mode 100644 index 0000000000..95dd257ef4 --- /dev/null +++ b/internal/datasource/cert/cert.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 cert + +import ( + "crypto/tls" + "crypto/x509" + "encoding/pem" + "fmt" + "os" +) + +func LoadCertificates(certPath, keyPath string) (*tls.Certificate, *x509.CertPool, error) { + cert, err := tls.LoadX509KeyPair(certPath, keyPath) + if err != nil { + return nil, nil, err + } + + cert.Leaf, err = x509.ParseCertificate(cert.Certificate[0]) + if err != nil { + return nil, nil, err + } + + pool := x509.NewCertPool() + pool.AddCert(cert.Leaf) + + return &cert, pool, nil +} + +func LoadCertificate(certPath string) (*x509.Certificate, error) { + fileContents, err := os.ReadFile(certPath) + if err != nil { + return nil, err + } + + block, _ := pem.Decode(fileContents) + if block == nil || block.Type != "CERTIFICATE" { + return nil, fmt.Errorf("failed to decode PEM block containing the certificate") + } + + cert, err := x509.ParseCertificate(block.Bytes) + if err != nil { + return nil, err + } + + return cert, nil +} diff --git a/internal/datasource/cert/cert_test.go b/internal/datasource/cert/cert_test.go new file mode 100644 index 0000000000..de9d447329 --- /dev/null +++ b/internal/datasource/cert/cert_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 cert + +import ( + "testing" + + "github.com/nginx/agent/v3/test/helpers" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +const ( + keyFileName = "key.pem" + certFileName = "cert.pem" + caFileName = "ca.pem" + nonPemCertFileName = "cert.nonpem" + certificateType = "CERTIFICATE" + privateKeyType = "RSA PRIVATE KEY" +) + +func TestLoadCertificates(t *testing.T) { + tmpDir := t.TempDir() + + key, cert := helpers.GenerateSelfSignedCert(t) + + keyContents := helpers.Cert{Name: keyFileName, Type: privateKeyType, Contents: key} + certContents := helpers.Cert{Name: certFileName, Type: certificateType, Contents: cert} + + keyFile := helpers.WriteCertFiles(t, tmpDir, keyContents) + certFile := helpers.WriteCertFiles(t, tmpDir, certContents) + + testCases := []struct { + testName string + certFile string + keyFile string + isError bool + }{ + { + testName: "valid files", + certFile: certFile, + keyFile: keyFile, + isError: false, + }, + { + testName: "invalid cert file", + certFile: "/invalid/cert.pem", + keyFile: keyFile, + isError: true, + }, + { + testName: "invalid key file", + certFile: certFile, + keyFile: "/invalid/key.pem", + isError: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.testName, func(t *testing.T) { + certificate, pool, loadErr := LoadCertificates(tc.certFile, tc.keyFile) + if tc.isError { + assert.Nil(t, certificate) + assert.Nil(t, pool) + require.Error(t, loadErr) + } else { + assert.Equal(t, cert, certificate.Certificate[0]) + assert.NotNil(t, pool) + require.NoError(t, loadErr) + } + }) + } +} + +func TestLoadCertificate(t *testing.T) { + tmpDir := t.TempDir() + + _, cert := helpers.GenerateSelfSignedCert(t) + + certContents := helpers.Cert{Name: certFileName, Type: certificateType, Contents: cert} + certNonPemContents := helpers.Cert{Name: nonPemCertFileName, Type: "", Contents: cert} + + certFile := helpers.WriteCertFiles(t, tmpDir, certContents) + nonPEMFile := helpers.WriteCertFiles(t, tmpDir, certNonPemContents) + require.NotEmpty(t, nonPEMFile) + + helpers.CreateFileWithErrorCheck(t, tmpDir, nonPemCertFileName) + + testCases := []struct { + testName string + certFile string + isError bool + }{ + { + testName: "valid cert file", + certFile: certFile, + isError: false, + }, + { + testName: "invalid cert file", + certFile: "/invalid/cert.pem", + isError: true, + }, + { + testName: "non-PEM cert file", + certFile: "", + isError: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.testName, func(t *testing.T) { + certificate, loadErr := LoadCertificate(tc.certFile) + if tc.isError { + assert.Nil(t, certificate) + require.Error(t, loadErr) + } else { + assert.Equal(t, cert, certificate.Raw) + require.NoError(t, loadErr) + } + }) + } +} diff --git a/internal/file/file_manager_service_test.go b/internal/file/file_manager_service_test.go index ec18f3bacd..ee058b1a31 100644 --- a/internal/file/file_manager_service_test.go +++ b/internal/file/file_manager_service_test.go @@ -7,6 +7,7 @@ package file import ( "context" + "fmt" "os" "path/filepath" "testing" @@ -443,7 +444,6 @@ func TestFileManagerService_DetermineFileActions(t *testing.T) { addAction := mpi.File_FILE_ACTION_ADD updateAction := mpi.File_FILE_ACTION_UPDATE deleteAction := mpi.File_FILE_ACTION_DELETE - // unchangedAction := mpi.File_FILE_ACTION_UNCHANGED tempDir := os.TempDir() @@ -642,3 +642,81 @@ func TestFileManagerService_fileActions(t *testing.T) { defer helpers.RemoveFileWithErrorCheck(t, updateFile.Name()) defer helpers.RemoveFileWithErrorCheck(t, addFilePath) } + +func TestParseX509Certificates(t *testing.T) { + tests := []struct { + certName string + certContent string + name string + expectedSerial []byte + }{ + { + name: "Test 1: generated cert", + certName: "public_cert", + certContent: "", + expectedSerial: []byte{0x1, 0xe0, 0xf3}, + }, + { + name: "Test 2: open ssl cert", + certName: "open_ssl_cert", + certContent: `-----BEGIN CERTIFICATE----- +MIIDazCCAlOgAwIBAgIUR+YGgRHhYwotFyBOvSc1KD9d45kwDQYJKoZIhvcNAQEL +BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDExMjcxNTM0MDZaFw0yNDEy +MjcxNTM0MDZaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw +HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnDDVGflbZ3dmuQJj+8QuJIQ8lWjVGYhlsFI4AGFTX +9VfYOqJEPyuMRuSj2eN7C/mR4yTJSggnv0kFtjmeGh2keNdmb4R/0CjYWZVl/Na6 +cAfldB8v2+sm0LZ/OD9F9CbnYB95takPOZq3AP5kUA+qlFYzroqXsxJKvZF6dUuI ++kTOn5pWD+eFmueFedOz1aucOvblUJLueVZnvAbIrBoyaulw3f2kjk0J1266nFMb +s72AvjyYbOXbyur3BhPThCaOeqMGggDmFslZ4pBgQFWUeFvmqJMFzf1atKTWlbj7 +Mj+bNKNs4xvUuNhqd/F99Pz2Fe0afKbTHK83hqgSHKbtAgMBAAGjUzBRMB0GA1Ud +DgQWBBQq0Bzde0bl9CFb81LrvFfdWlY7hzAfBgNVHSMEGDAWgBQq0Bzde0bl9CFb +81LrvFfdWlY7hzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAo +8GXvwRa0M0D4x4Lrj2K57FxH4ECNBnAqWlh3Ce9LEioL2CYaQQw6I2/FsnTk8TYY +WgGgXMEyA6OeOXvwxWjSllK9+D2ueTMhNRO0tYMUi0kDJqd9EpmnEcSWIL2G2SNo +BWQjqEoEKFjvrgx6h13AtsFlpdURoVtodrtnUrXp1r4wJvljC2qexoNfslhpbqsT +X/vYrzgKRoKSUWUt1ejKTntrVuaJK4NMxANOTTjIXgxyoV3YcgEmL9KzribCqILi +p79Nno9d+kovtX5VKsJ5FCcPw9mEATgZDOQ4nLTk/HHG6bwtpubp6Zb7H1AjzBkz +rQHX6DP4w6IwZY8JB8LS +-----END CERTIFICATE-----`, + expectedSerial: []byte{ + 0x47, 0xe6, 0x6, + 0x81, 0x11, 0xe1, + 0x63, 0xa, 0x2d, + 0x17, 0x20, 0x4e, + 0xbd, 0x27, 0x35, + 0x28, 0x3f, 0x5d, + 0xe3, 0x99, + }, + }, + } + + tempDir := os.TempDir() + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + var certBytes []byte + var certPath string + + if test.certContent == "" { + _, certBytes = helpers.GenerateSelfSignedCert(t) + certContents := helpers.Cert{ + Name: fmt.Sprintf("%s.pem", test.certName), + Type: "CERTIFICATE", + Contents: certBytes, + } + certPath = helpers.WriteCertFiles(t, tempDir, certContents) + } else { + certPath = fmt.Sprintf("%s%c%s", tempDir, os.PathSeparator, test.certName) + err := os.WriteFile(certPath, []byte(test.certContent), 0o600) + require.NoError(t, err) + } + + certFileMeta, certFileMetaErr := files.FileMetaWithCertificate(certPath) + require.NoError(t, certFileMetaErr) + + assert.Equal(t, test.expectedSerial, certFileMeta.GetCertificateMeta().GetSerialNumber()) + }) + } +} diff --git a/internal/file/file_plugin_test.go b/internal/file/file_plugin_test.go index 93683c181e..161428b770 100644 --- a/internal/file/file_plugin_test.go +++ b/internal/file/file_plugin_test.go @@ -12,6 +12,8 @@ import ( "testing" "time" + "github.com/nginx/agent/v3/internal/bus/busfakes" + "github.com/google/uuid" "google.golang.org/protobuf/types/known/timestamppb" @@ -81,7 +83,7 @@ func TestFilePlugin_Process_NginxConfigUpdateTopic(t *testing.T) { fakeGrpcConnection := &grpcfakes.FakeGrpcConnectionInterface{} fakeGrpcConnection.FileServiceClientReturns(fakeFileServiceClient) - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() filePlugin := NewFilePlugin(types.AgentConfig(), fakeGrpcConnection) err := filePlugin.Init(ctx, messagePipe) @@ -157,7 +159,7 @@ func TestFilePlugin_Process_ConfigApplyRequestTopic(t *testing.T) { t.Run(test.name, func(t *testing.T) { fakeFileManagerService := &filefakes.FakeFileManagerServiceInterface{} fakeFileManagerService.ConfigApplyReturns(test.configApplyStatus, test.configApplyReturnsErr) - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() filePlugin := NewFilePlugin(agentConfig, fakeGrpcConnection) err := filePlugin.Init(ctx, messagePipe) filePlugin.fileManagerService = fakeFileManagerService @@ -254,7 +256,7 @@ func TestFilePlugin_Process_ConfigUploadRequestTopic(t *testing.T) { fakeFileServiceClient := &v1fakes.FakeFileServiceClient{} fakeGrpcConnection := &grpcfakes.FakeGrpcConnectionInterface{} fakeGrpcConnection.FileServiceClientReturns(fakeFileServiceClient) - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() filePlugin := NewFilePlugin(types.AgentConfig(), fakeGrpcConnection) err := filePlugin.Init(ctx, messagePipe) @@ -309,7 +311,7 @@ func TestFilePlugin_Process_ConfigUploadRequestTopic_Failure(t *testing.T) { fakeFileServiceClient := &v1fakes.FakeFileServiceClient{} fakeGrpcConnection := &grpcfakes.FakeGrpcConnectionInterface{} fakeGrpcConnection.FileServiceClientReturns(fakeFileServiceClient) - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() filePlugin := NewFilePlugin(types.AgentConfig(), fakeGrpcConnection) err := filePlugin.Init(ctx, messagePipe) @@ -386,7 +388,7 @@ func TestFilePlugin_Process_ConfigApplyFailedTopic(t *testing.T) { fakeGrpcConnection := &grpcfakes.FakeGrpcConnectionInterface{} fakeGrpcConnection.FileServiceClientReturns(fakeFileServiceClient) - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() agentConfig := types.AgentConfig() filePlugin := NewFilePlugin(agentConfig, fakeGrpcConnection) @@ -432,7 +434,7 @@ func TestFilePlugin_Process_ConfigApplyRollbackCompleteTopic(t *testing.T) { instance := protos.GetNginxOssInstance([]string{}) mockFileManager := &filefakes.FakeFileManagerServiceInterface{} - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() agentConfig := types.AgentConfig() fakeGrpcConnection := &grpcfakes.FakeGrpcConnectionInterface{} filePlugin := NewFilePlugin(agentConfig, fakeGrpcConnection) diff --git a/internal/model/config.go b/internal/model/config.go index 3f37428912..15f0bbfbdb 100644 --- a/internal/model/config.go +++ b/internal/model/config.go @@ -12,20 +12,32 @@ import ( ) type NginxConfigContext struct { - StubStatus string - PlusAPI string + StubStatus *APIDetails + PlusAPI *APIDetails InstanceID string Files []*v1.File AccessLogs []*AccessLog ErrorLogs []*ErrorLog } +type APIDetails struct { + URL string + Listen string + Location string +} + +// Complexity is 11, allowed is 10 +// nolint: revive, cyclop func (ncc *NginxConfigContext) Equal(otherNginxConfigContext *NginxConfigContext) bool { - if ncc.StubStatus != otherNginxConfigContext.StubStatus { + if ncc.StubStatus.URL != otherNginxConfigContext.StubStatus.URL || ncc.StubStatus.Listen != + otherNginxConfigContext.StubStatus.Listen || ncc.StubStatus.Location != + otherNginxConfigContext.StubStatus.Location { return false } - if ncc.PlusAPI != otherNginxConfigContext.PlusAPI { + if ncc.PlusAPI.URL != otherNginxConfigContext.PlusAPI.URL || ncc.PlusAPI.Listen != + otherNginxConfigContext.PlusAPI.Listen || ncc.PlusAPI.Location != + otherNginxConfigContext.PlusAPI.Location { return false } diff --git a/internal/model/config_test.go b/internal/model/config_test.go index eea285094f..0d7ea9069c 100644 --- a/internal/model/config_test.go +++ b/internal/model/config_test.go @@ -14,8 +14,14 @@ import ( ) var nginxConfigContext = &NginxConfigContext{ - StubStatus: "", - PlusAPI: "", + StubStatus: &APIDetails{ + URL: "", + Listen: "", + }, + PlusAPI: &APIDetails{ + URL: "", + Listen: "", + }, InstanceID: "12333", Files: []*mpi.File{ { @@ -42,10 +48,16 @@ func TestNginxConfigContext_Equal(t *testing.T) { nginxConfigContextWithSameValues := *nginxConfigContext nginxConfigContextWithDifferentStubStatus := *nginxConfigContext - nginxConfigContextWithDifferentStubStatus.StubStatus = "http://localhost:8080/stub_status" + nginxConfigContextWithDifferentStubStatus.StubStatus = &APIDetails{ + URL: "http://localhost:8080/stub_status", + Listen: "", + } nginxConfigContextWithDifferentPlusAPI := *nginxConfigContext - nginxConfigContextWithDifferentPlusAPI.PlusAPI = "http://localhost:8080/api" + nginxConfigContextWithDifferentPlusAPI.PlusAPI = &APIDetails{ + URL: "http://localhost:8080/api", + Listen: "", + } nginxConfigContextWithDifferentInstanceID := *nginxConfigContext nginxConfigContextWithDifferentInstanceID.InstanceID = "567" diff --git a/internal/resource/nginx_log_tailer_operator.go b/internal/resource/nginx_log_tailer_operator.go index cf3a24f3d5..3a62f12eee 100644 --- a/internal/resource/nginx_log_tailer_operator.go +++ b/internal/resource/nginx_log_tailer_operator.go @@ -24,12 +24,11 @@ type NginxLogTailerOperator struct { var _ logTailerOperator = (*NginxLogTailerOperator)(nil) var ( - reloadErrorList = []*re.Regexp{ - re.MustCompile(`.*\[emerg\].*`), - re.MustCompile(`.*\[alert\].*`), - re.MustCompile(`.*\[crit\].*`), - } - warningRegex = re.MustCompile(`.*\[warn\].*`) + // Line is over 120 characters long, regex needs to be on one line so needs to be ignored by linter + // nolint: lll + reloadErrorList = re.MustCompile(`\d{1,4}\/\d{1,2}\/\d{1,2} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9] ?(nginx\:|) (\[emerg\]|\[alert\]|\[crit\])`) + // nolint: lll + warningRegex = re.MustCompile(`\d{1,4}\/\d{1,2}\/\d{1,2} ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9] ?(nginx\:|) (\[warn\])`) ignoreErrorList = re.MustCompile(`.*(usage report| license expired).*`) ) @@ -72,16 +71,12 @@ func (l *NginxLogTailerOperator) Tail(ctx context.Context, errorLog string, erro } func (l *NginxLogTailerOperator) doesLogLineContainError(line string) bool { - if l.agentConfig.DataPlaneConfig.Nginx.TreatWarningsAsErrors && warningRegex.MatchString(line) && - !ignoreErrorList.MatchString(line) { + if ignoreErrorList.MatchString(line) { + return false + } else if (l.agentConfig.DataPlaneConfig.Nginx.TreatWarningsAsErrors && warningRegex.MatchString(line)) || + reloadErrorList.MatchString(line) { return true } - for _, errorRegex := range reloadErrorList { - if errorRegex.MatchString(line) && !ignoreErrorList.MatchString(line) { - return true - } - } - return false } diff --git a/internal/resource/nginx_log_tailer_operator_test.go b/internal/resource/nginx_log_tailer_operator_test.go index 6126e66666..c7643d9d0a 100644 --- a/internal/resource/nginx_log_tailer_operator_test.go +++ b/internal/resource/nginx_log_tailer_operator_test.go @@ -8,21 +8,26 @@ package resource import ( "bytes" "context" - "errors" "fmt" "sync" "testing" "time" + "github.com/nginx/agent/v3/test/types" + "github.com/stretchr/testify/assert" "github.com/nginx/agent/v3/test/helpers" - "github.com/nginx/agent/v3/test/types" "github.com/stretchr/testify/require" ) const ( - errorLogLine = "2023/03/14 14:16:23 [emerg] 3871#3871: bind() to 0.0.0.0:8081 failed (98: Address already in use)" + errorLogLine = "2023/03/14 14:16:23 [emerg] 3871#3871: bind() to 0.0.0.0:8081 failed (98: Address already in use)" + critLogLine = "2023/07/07 11:30:00 [crit] 123456#123456: *1 connect() to unix:/test/test/test/test.sock failed" + + " (2: No such file or directory) while connecting to upstream, client: 0.0.0.0, server: _, request:" + + " \"POST /test HTTP/2.0\", upstream: \"grpc://unix:/test/test/test/test.sock:\", host: \"0.0.0.0:0\"" + alertLogLine = "2023/06/20 11:01:56 [alert] 4138#4138: open() \"/var/log/nginx/error.log\" failed (13: Permission" + + " denied)" warningLogLine = "2023/03/14 14:16:23 nginx: [warn] 2048 worker_connections exceed open file resource limit: 1024" ) @@ -34,7 +39,6 @@ func TestLogOperator_Tail(t *testing.T) { tests := []struct { out *bytes.Buffer - err error expected error name string errorLogs string @@ -45,7 +49,6 @@ func TestLogOperator_Tail(t *testing.T) { out: bytes.NewBufferString(""), errorLogs: errorLogFile.Name(), errorLogContents: "", - err: nil, expected: nil, }, { @@ -53,16 +56,14 @@ func TestLogOperator_Tail(t *testing.T) { out: bytes.NewBufferString(""), errorLogs: errorLogFile.Name(), errorLogContents: errorLogLine, - err: nil, - expected: errors.Join(fmt.Errorf("%s", errorLogLine)), + expected: fmt.Errorf("%s", errorLogLine), }, { name: "Test 3: Warning in error logs", out: bytes.NewBufferString(""), errorLogs: errorLogFile.Name(), errorLogContents: warningLogLine, - err: nil, - expected: errors.Join(fmt.Errorf("%s", warningLogLine)), + expected: fmt.Errorf("%s", warningLogLine), }, { name: "Test 4: ignore error log: usage report ", @@ -70,7 +71,6 @@ func TestLogOperator_Tail(t *testing.T) { errorLogs: errorLogFile.Name(), errorLogContents: "2025/06/25 15:08:04 [error] 123456#123456: certificate verify error: " + "(10:certificate has expired) during usage report", - err: nil, expected: nil, }, { @@ -79,7 +79,6 @@ func TestLogOperator_Tail(t *testing.T) { errorLogs: errorLogFile.Name(), errorLogContents: "2025/06/25 15:07:24 [alert] 123456#123456: license expired; the grace period " + "will end in 71 days", - err: nil, expected: nil, }, { @@ -87,35 +86,113 @@ func TestLogOperator_Tail(t *testing.T) { out: bytes.NewBufferString(""), errorLogs: errorLogFile.Name(), errorLogContents: "2024/12/25 15:00:04 [error] 123456#123456: server returned 400 during usage report", - err: nil, expected: nil, }, } for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - operator := NewLogTailerOperator(types.AgentConfig()) + t.Run(test.name, func(tt *testing.T) { + agentConfig := types.AgentConfig() + agentConfig.DataPlaneConfig.Nginx.ReloadMonitoringPeriod = 5 * time.Second + operator := NewLogTailerOperator(agentConfig) logErrorChannel := make(chan error, len(test.errorLogs)) defer close(logErrorChannel) var wg sync.WaitGroup wg.Add(1) - operator.Tail(ctx, test.errorLogs, logErrorChannel) go func(testErr error) { defer wg.Done() + operator.Tail(ctx, test.errorLogs, logErrorChannel) err := <-logErrorChannel - assert.Equal(t, testErr, err) - }(test.err) + assert.Equal(tt, testErr, err) + }(test.expected) - time.Sleep(200 * time.Millisecond) + time.Sleep(100 * time.Millisecond) if test.errorLogContents != "" { _, err := errorLogFile.WriteString(test.errorLogContents) - require.NoError(t, err, "Error writing data to error log file") + require.NoError(tt, err, "Error writing data to error log file") } wg.Wait() }) } } + +func TestLogOperator_doesLogLineContainError(t *testing.T) { + tests := []struct { + name string + line string + treatWarnAsError bool + expected bool + }{ + { + name: "Test 1: no error in line", + line: "", + treatWarnAsError: false, + expected: false, + }, + { + name: "Test 2: emerg in line", + line: errorLogLine, + treatWarnAsError: false, + expected: true, + }, + { + name: "Test 3: crit in line", + line: critLogLine, + treatWarnAsError: false, + expected: true, + }, + { + name: "Test 4: alert in line", + line: alertLogLine, + treatWarnAsError: false, + expected: true, + }, + { + name: "Test 5: warn in line, treat warn as error off", + line: warningLogLine, + treatWarnAsError: false, + expected: false, + }, + { + name: "Test 6: warn in line, treat warn as error on", + line: warningLogLine, + treatWarnAsError: true, + expected: true, + }, + { + name: "Test 7: ignore error, usage report", + line: "2025/06/25 15:08:04 [error] 123456#123456: certificate verify error: " + + "(10:certificate has expired) during usage report", + treatWarnAsError: false, + expected: false, + }, + { + name: "Test 8: ignore error, license expired", + line: "2025/06/25 15:07:24 [alert] 123456#123456: license expired; the grace period " + + "will end in 71 days", + treatWarnAsError: false, + expected: false, + }, + { + name: "Test 9: check log is ignored, [emerg] in log but not at emerg level", + line: "2025/06/25 15:07:24 [info] 123456#123456: checking [emerg] is ignored", + treatWarnAsError: false, + expected: false, + }, + } + + for _, test := range tests { + t.Run(test.name, func(tt *testing.T) { + agentConfig := types.AgentConfig() + agentConfig.DataPlaneConfig.Nginx.TreatWarningsAsErrors = test.treatWarnAsError + operator := NewLogTailerOperator(agentConfig) + + result := operator.doesLogLineContainError(test.line) + assert.Equal(tt, test.expected, result) + }) + } +} diff --git a/internal/resource/resource_plugin_test.go b/internal/resource/resource_plugin_test.go index 8f345f1ecb..d1bcc79d72 100644 --- a/internal/resource/resource_plugin_test.go +++ b/internal/resource/resource_plugin_test.go @@ -12,6 +12,8 @@ import ( "sort" "testing" + "github.com/nginx/agent/v3/internal/bus/busfakes" + "github.com/nginx/agent/v3/internal/model" "github.com/nginx/agent/v3/test/types" @@ -95,7 +97,7 @@ func TestResource_Process(t *testing.T) { fakeResourceService.AddInstancesReturns(protos.GetHostResource()) fakeResourceService.UpdateInstancesReturns(test.resource) fakeResourceService.DeleteInstancesReturns(test.resource) - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() resourcePlugin := NewResource(types.AgentConfig()) resourcePlugin.resourceService = fakeResourceService @@ -154,7 +156,7 @@ func TestResource_Process_Apply(t *testing.T) { t.Run(test.name, func(tt *testing.T) { fakeResourceService := &resourcefakes.FakeResourceServiceInterface{} fakeResourceService.ApplyConfigReturns(test.applyErr) - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() resourcePlugin := NewResource(types.AgentConfig()) resourcePlugin.resourceService = fakeResourceService @@ -222,7 +224,7 @@ func TestResource_Process_Rollback(t *testing.T) { t.Run(test.name, func(tt *testing.T) { fakeResourceService := &resourcefakes.FakeResourceServiceInterface{} fakeResourceService.ApplyConfigReturns(test.rollbackErr) - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() resourcePlugin := NewResource(types.AgentConfig()) resourcePlugin.resourceService = fakeResourceService @@ -278,7 +280,7 @@ func TestResource_Init(t *testing.T) { ctx := context.Background() resourceService := resourcefakes.FakeResourceServiceInterface{} - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() messagePipe.RunWithoutInit(ctx) resourcePlugin := NewResource(types.AgentConfig()) diff --git a/internal/watcher/instance/instance_watcher_service.go b/internal/watcher/instance/instance_watcher_service.go index 958ad96866..fb64ecdc32 100644 --- a/internal/watcher/instance/instance_watcher_service.go +++ b/internal/watcher/instance/instance_watcher_service.go @@ -295,7 +295,7 @@ func (iw *InstanceWatcherService) agentInstance(ctx context.Context) *mpi.Instan Actions: []*mpi.InstanceAction{}, Config: &mpi.InstanceConfig_AgentConfig{ AgentConfig: &mpi.AgentConfig{ - Command: &mpi.CommandServer{}, + Command: config.ToCommandProto(iw.agentConfig.Command), Metrics: &mpi.MetricsServer{}, File: &mpi.FileServer{}, Labels: []*structpb.Struct{}, @@ -397,25 +397,23 @@ func (iw *InstanceWatcherService) updateNginxInstanceRuntime( if instanceType == mpi.InstanceMeta_INSTANCE_TYPE_NGINX_PLUS { nginxPlusRuntimeInfo := instance.GetInstanceRuntime().GetNginxPlusRuntimeInfo() - if !reflect.DeepEqual(nginxPlusRuntimeInfo.GetAccessLogs(), accessLogs) || - !reflect.DeepEqual(nginxPlusRuntimeInfo.GetErrorLogs(), errorLogs) || - nginxPlusRuntimeInfo.GetStubStatus() != nginxConfigContext.StubStatus || - nginxPlusRuntimeInfo.GetPlusApi() != nginxConfigContext.PlusAPI { + if nginxPlusRuntimeInfoEqual(nginxPlusRuntimeInfo, nginxConfigContext, accessLogs, errorLogs) { nginxPlusRuntimeInfo.AccessLogs = accessLogs nginxPlusRuntimeInfo.ErrorLogs = errorLogs - nginxPlusRuntimeInfo.StubStatus = nginxConfigContext.StubStatus - nginxPlusRuntimeInfo.PlusApi = nginxConfigContext.PlusAPI + nginxPlusRuntimeInfo.StubStatus.Listen = nginxConfigContext.StubStatus.Listen + nginxPlusRuntimeInfo.PlusApi.Listen = nginxConfigContext.PlusAPI.Listen + nginxPlusRuntimeInfo.StubStatus.Location = nginxConfigContext.StubStatus.Location + nginxPlusRuntimeInfo.PlusApi.Location = nginxConfigContext.PlusAPI.Location updatesRequired = true } } else { nginxRuntimeInfo := instance.GetInstanceRuntime().GetNginxRuntimeInfo() - if !reflect.DeepEqual(nginxRuntimeInfo.GetAccessLogs(), accessLogs) || - !reflect.DeepEqual(nginxRuntimeInfo.GetErrorLogs(), errorLogs) || - nginxRuntimeInfo.GetStubStatus() != nginxConfigContext.StubStatus { + if nginxRuntimeInfoEqual(nginxRuntimeInfo, nginxConfigContext, accessLogs, errorLogs) { nginxRuntimeInfo.AccessLogs = accessLogs nginxRuntimeInfo.ErrorLogs = errorLogs - nginxRuntimeInfo.StubStatus = nginxConfigContext.StubStatus + nginxRuntimeInfo.StubStatus.Location = nginxConfigContext.StubStatus.Location + nginxRuntimeInfo.StubStatus.Listen = nginxConfigContext.StubStatus.Listen updatesRequired = true } } @@ -423,6 +421,34 @@ func (iw *InstanceWatcherService) updateNginxInstanceRuntime( return updatesRequired } +func nginxPlusRuntimeInfoEqual(nginxPlusRuntimeInfo *mpi.NGINXPlusRuntimeInfo, + nginxConfigContext *model.NginxConfigContext, accessLogs, errorLogs []string, +) bool { + if !reflect.DeepEqual(nginxPlusRuntimeInfo.GetAccessLogs(), accessLogs) || + !reflect.DeepEqual(nginxPlusRuntimeInfo.GetErrorLogs(), errorLogs) || + nginxPlusRuntimeInfo.GetStubStatus().GetListen() != nginxConfigContext.StubStatus.Listen || + nginxPlusRuntimeInfo.GetPlusApi().GetListen() != nginxConfigContext.PlusAPI.Listen || + nginxPlusRuntimeInfo.GetStubStatus().GetLocation() != nginxConfigContext.StubStatus.Location || + nginxPlusRuntimeInfo.GetPlusApi().GetLocation() != nginxConfigContext.PlusAPI.Location { + return true + } + + return false +} + +func nginxRuntimeInfoEqual(nginxRuntimeInfo *mpi.NGINXRuntimeInfo, nginxConfigContext *model.NginxConfigContext, + accessLogs, errorLogs []string, +) bool { + if !reflect.DeepEqual(nginxRuntimeInfo.GetAccessLogs(), accessLogs) || + !reflect.DeepEqual(nginxRuntimeInfo.GetErrorLogs(), errorLogs) || + nginxRuntimeInfo.GetStubStatus().GetListen() != nginxConfigContext.StubStatus.Listen || + nginxRuntimeInfo.GetStubStatus().GetLocation() != nginxConfigContext.StubStatus.Location { + return true + } + + return false +} + func convertAccessLogs(accessLogs []*model.AccessLog) (logs []string) { for _, log := range accessLogs { logs = append(logs, log.Name) diff --git a/internal/watcher/instance/instance_watcher_service_test.go b/internal/watcher/instance/instance_watcher_service_test.go index fb6a0cf49f..f71ff3e988 100644 --- a/internal/watcher/instance/instance_watcher_service_test.go +++ b/internal/watcher/instance/instance_watcher_service_test.go @@ -168,7 +168,10 @@ func TestInstanceWatcherService_updateNginxInstanceRuntime(t *testing.T) { Name: "/usr/local/var/log/nginx/error.log", }, }, - StubStatus: "http://127.0.0.1:8081/api", + StubStatus: &model.APIDetails{ + URL: "http://127.0.0.1:8081/api", + Listen: "", + }, } nginxPlusConfigContext := &model.NginxConfigContext{ @@ -182,7 +185,14 @@ func TestInstanceWatcherService_updateNginxInstanceRuntime(t *testing.T) { Name: "/usr/local/var/log/nginx/error.log", }, }, - PlusAPI: "http://127.0.0.1:8081/api", + PlusAPI: &model.APIDetails{ + URL: "http://127.0.0.1:8081/api", + Listen: "", + }, + StubStatus: &model.APIDetails{ + URL: "http://127.0.0.1:8081/api", + Listen: "", + }, } tests := []struct { @@ -210,17 +220,23 @@ func TestInstanceWatcherService_updateNginxInstanceRuntime(t *testing.T) { GetNginxPlusRuntimeInfo().GetAccessLogs()[0]) assert.Equal(t, test.nginxConfigContext.ErrorLogs[0].Name, test.instance.GetInstanceRuntime(). GetNginxPlusRuntimeInfo().GetErrorLogs()[0]) - assert.Equal(t, test.nginxConfigContext.StubStatus, test.instance.GetInstanceRuntime(). - GetNginxPlusRuntimeInfo().GetStubStatus()) - assert.Equal(t, test.nginxConfigContext.PlusAPI, test.instance.GetInstanceRuntime(). - GetNginxPlusRuntimeInfo().GetPlusApi()) + assert.Equal(t, test.nginxConfigContext.StubStatus.Location, test.instance.GetInstanceRuntime(). + GetNginxPlusRuntimeInfo().GetStubStatus().GetLocation()) + assert.Equal(t, test.nginxConfigContext.PlusAPI.Location, test.instance.GetInstanceRuntime(). + GetNginxPlusRuntimeInfo().GetPlusApi().GetLocation()) + assert.Equal(t, test.nginxConfigContext.StubStatus.Listen, test.instance.GetInstanceRuntime(). + GetNginxPlusRuntimeInfo().GetStubStatus().GetListen()) + assert.Equal(t, test.nginxConfigContext.PlusAPI.Listen, test.instance.GetInstanceRuntime(). + GetNginxPlusRuntimeInfo().GetPlusApi().GetListen()) } else { assert.Equal(t, test.nginxConfigContext.AccessLogs[0].Name, test.instance.GetInstanceRuntime(). GetNginxRuntimeInfo().GetAccessLogs()[0]) assert.Equal(t, test.nginxConfigContext.ErrorLogs[0].Name, test.instance.GetInstanceRuntime(). GetNginxRuntimeInfo().GetErrorLogs()[0]) - assert.Equal(t, test.nginxConfigContext.StubStatus, test.instance.GetInstanceRuntime(). - GetNginxRuntimeInfo().GetStubStatus()) + assert.Equal(t, test.nginxConfigContext.StubStatus.Location, test.instance.GetInstanceRuntime(). + GetNginxRuntimeInfo().GetStubStatus().GetLocation()) + assert.Equal(t, test.nginxConfigContext.StubStatus.Listen, test.instance.GetInstanceRuntime(). + GetNginxRuntimeInfo().GetStubStatus().GetListen()) } }) } diff --git a/internal/watcher/instance/nginx_config_parser.go b/internal/watcher/instance/nginx_config_parser.go index ab147e2bd5..34beb8a97c 100644 --- a/internal/watcher/instance/nginx_config_parser.go +++ b/internal/watcher/instance/nginx_config_parser.go @@ -35,6 +35,8 @@ const ( plusAPIDirective = "api" stubStatusAPIDirective = "stub_status" apiFormat = "http://%s%s" + unixStubStatusFormat = "http://config-status%s" + unixPlusAPIFormat = "http://nginx-plus-api%s" locationDirective = "location" ) @@ -47,8 +49,9 @@ type ( var _ nginxConfigParser = (*NginxConfigParser)(nil) type ( - crossplaneTraverseCallback = func(ctx context.Context, parent, current *crossplane.Directive) error - crossplaneTraverseCallbackStr = func(ctx context.Context, parent, current *crossplane.Directive) string + crossplaneTraverseCallback = func(ctx context.Context, parent, current *crossplane.Directive) error + crossplaneTraverseCallbackAPIDetails = func(ctx context.Context, parent, + current *crossplane.Directive, apiType string) *model.APIDetails ) func NewNginxConfigParser(agentConfig *config.Config) *NginxConfigParser { @@ -92,6 +95,16 @@ func (ncp *NginxConfigParser) createNginxConfigContext( ) (*model.NginxConfigContext, error) { nginxConfigContext := &model.NginxConfigContext{ InstanceID: instance.GetInstanceMeta().GetInstanceId(), + PlusAPI: &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, + StubStatus: &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, } rootDir := filepath.Dir(instance.GetInstanceRuntime().GetConfigPath()) @@ -129,16 +142,14 @@ func (ncp *NginxConfigParser) createNginxConfigContext( return nginxConfigContext, fmt.Errorf("traverse nginx config: %w", err) } - stubStatus := ncp.crossplaneConfigTraverseStr(ctx, &conf, ncp.stubStatusAPICallback) - if stubStatus != "" { + stubStatus := ncp.crossplaneConfigTraverseAPIDetails(ctx, &conf, ncp.apiCallback, stubStatusAPIDirective) + if stubStatus.URL != "" { nginxConfigContext.StubStatus = stubStatus } - if instance.GetInstanceMeta().GetInstanceType() == mpi.InstanceMeta_INSTANCE_TYPE_NGINX_PLUS { - plusAPIURL := ncp.crossplaneConfigTraverseStr(ctx, &conf, ncp.plusAPICallback) - if plusAPIURL != "" { - nginxConfigContext.PlusAPI = plusAPIURL - } + plusAPI := ncp.crossplaneConfigTraverseAPIDetails(ctx, &conf, ncp.apiCallback, plusAPIDirective) + if plusAPI.URL != "" { + nginxConfigContext.PlusAPI = plusAPI } fileMeta, err := files.FileMeta(conf.File) @@ -303,7 +314,7 @@ func (ncp *NginxConfigParser) sslCert(ctx context.Context, file, rootDir string) if !ncp.agentConfig.IsDirectoryAllowed(file) { slog.DebugContext(ctx, "File not in allowed directories", "file", file) } else { - sslCertFileMeta, fileMetaErr := files.FileMeta(file) + sslCertFileMeta, fileMetaErr := files.FileMetaWithCertificate(file) if fileMetaErr != nil { slog.ErrorContext(ctx, "Unable to get file metadata", "file", file, "error", fileMetaErr) } else { @@ -334,20 +345,25 @@ func (ncp *NginxConfigParser) crossplaneConfigTraverse( return nil } -func (ncp *NginxConfigParser) crossplaneConfigTraverseStr( +func (ncp *NginxConfigParser) crossplaneConfigTraverseAPIDetails( ctx context.Context, root *crossplane.Config, - callback crossplaneTraverseCallbackStr, -) string { + callback crossplaneTraverseCallbackAPIDetails, + apiType string, +) *model.APIDetails { stop := false - response := "" + response := &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + } for _, dir := range root.Parsed { - response = callback(ctx, nil, dir) - if response != "" { + response = callback(ctx, nil, dir, apiType) + if response.URL != "" { return response } - response = traverseStr(ctx, dir, callback, &stop) - if response != "" { + response = traverseAPIDetails(ctx, dir, callback, &stop, apiType) + if response.URL != "" { return response } } @@ -355,23 +371,32 @@ func (ncp *NginxConfigParser) crossplaneConfigTraverseStr( return response } -func traverseStr( +func traverseAPIDetails( ctx context.Context, root *crossplane.Directive, - callback crossplaneTraverseCallbackStr, + callback crossplaneTraverseCallbackAPIDetails, stop *bool, -) string { - response := "" + apiType string, +) *model.APIDetails { + response := &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + } if *stop { - return "" + return &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + } } for _, child := range root.Block { - response = callback(ctx, root, child) - if response != "" { + response = callback(ctx, root, child, apiType) + if response.URL != "" { *stop = true return response } - response = traverseStr(ctx, child, callback, stop) + response = traverseAPIDetails(ctx, child, callback, stop, apiType) if *stop { return response } @@ -404,39 +429,55 @@ func (ncp *NginxConfigParser) hasAdditionArguments(args []string) bool { return len(args) >= defaultNumberOfDirectiveArguments } -func (ncp *NginxConfigParser) stubStatusAPICallback(ctx context.Context, parent, current *crossplane.Directive) string { - urls := ncp.urlsForLocationDirective(parent, current, stubStatusAPIDirective) +func (ncp *NginxConfigParser) apiCallback(ctx context.Context, parent, + current *crossplane.Directive, apiType string, +) *model.APIDetails { + urls := ncp.urlsForLocationDirectiveAPIDetails(parent, current, apiType) if len(urls) > 0 { - slog.DebugContext(ctx, "Potential stub_status urls", "urls", urls) + slog.DebugContext(ctx, fmt.Sprintf("Potential %s urls", apiType), "urls", urls) } for _, url := range urls { - if ncp.pingStubStatusAPIEndpoint(ctx, url) { - slog.DebugContext(ctx, "Stub_status found", "url", url) + if ncp.pingAPIEndpoint(ctx, url, apiType) { + slog.DebugContext(ctx, fmt.Sprintf("%s found", apiType), "url", url) return url } - slog.DebugContext(ctx, "Stub_status is not reachable", "url", url) + slog.DebugContext(ctx, fmt.Sprintf("%s is not reachable", apiType), "url", url) } - return "" + return &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + } } -func (ncp *NginxConfigParser) pingStubStatusAPIEndpoint(ctx context.Context, statusAPI string) bool { - httpClient := http.Client{Timeout: ncp.agentConfig.Client.Timeout} +func (ncp *NginxConfigParser) pingAPIEndpoint(ctx context.Context, statusAPIDetail *model.APIDetails, + apiType string, +) bool { + httpClient := http.Client{} + listen := statusAPIDetail.Listen + statusAPI := statusAPIDetail.URL + + if strings.HasPrefix(listen, "unix:") { + httpClient = ncp.SocketClient(strings.TrimPrefix(listen, "unix:")) + } else { + httpClient = http.Client{Timeout: ncp.agentConfig.Client.Timeout} + } req, err := http.NewRequestWithContext(ctx, http.MethodGet, statusAPI, nil) if err != nil { - slog.WarnContext(ctx, "Unable to create Stub Status API GET request", "error", err) + slog.WarnContext(ctx, fmt.Sprintf("Unable to create %s API GET request", apiType), "error", err) return false } resp, err := httpClient.Do(req) if err != nil { - slog.WarnContext(ctx, "Unable to GET Stub Status from API request", "error", err) + slog.WarnContext(ctx, fmt.Sprintf("Unable to GET %s from API request", apiType), "error", err) return false } if resp.StatusCode != http.StatusOK { - slog.DebugContext(ctx, "Stub Status API responded with unexpected status code", "status_code", + slog.DebugContext(ctx, fmt.Sprintf("%s API responded with unexpected status code", apiType), "status_code", resp.StatusCode, "expected", http.StatusOK) return false @@ -444,7 +485,7 @@ func (ncp *NginxConfigParser) pingStubStatusAPIEndpoint(ctx context.Context, sta bodyBytes, err := io.ReadAll(resp.Body) if err != nil { - slog.WarnContext(ctx, "Unable to read Stub Status API response body", "error", err) + slog.WarnContext(ctx, fmt.Sprintf("Unable to read %s API response body", apiType), "error", err) return false } @@ -454,55 +495,13 @@ func (ncp *NginxConfigParser) pingStubStatusAPIEndpoint(ctx context.Context, sta // server accepts handled requests // 18 18 3266 // Reading: 0 Writing: 1 Waiting: 1 - body := string(bodyBytes) - defer resp.Body.Close() - - return strings.Contains(body, "Active connections") && strings.Contains(body, "server accepts handled requests") -} - -func (ncp *NginxConfigParser) plusAPICallback(ctx context.Context, parent, current *crossplane.Directive) string { - urls := ncp.urlsForLocationDirective(parent, current, plusAPIDirective) - if len(urls) > 0 { - slog.DebugContext(ctx, "Potential Plus API urls", "urls", urls) - } - - for _, url := range urls { - if ncp.pingPlusAPIEndpoint(ctx, url) { - slog.DebugContext(ctx, "Plus API found", "url", url) - return url - } - slog.DebugContext(ctx, "Plus API is not reachable", "url", url) - } - - return "" -} - -func (ncp *NginxConfigParser) pingPlusAPIEndpoint(ctx context.Context, statusAPI string) bool { - httpClient := http.Client{Timeout: ncp.agentConfig.Client.Timeout} - req, err := http.NewRequestWithContext(ctx, http.MethodGet, statusAPI, nil) - if err != nil { - slog.WarnContext(ctx, "Unable to create NGINX Plus API GET request", "error", err) - return false - } - resp, err := httpClient.Do(req) - if err != nil { - slog.WarnContext(ctx, "Unable to GET NGINX Plus API from API request", "error", err) - return false - } - - if resp.StatusCode != http.StatusOK { - slog.DebugContext(ctx, "NGINX Plus API responded with unexpected status code", "status_code", - resp.StatusCode, "expected", http.StatusOK) - return false - } + if apiType == stubStatusAPIDirective { + body := string(bodyBytes) + defer resp.Body.Close() - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - slog.WarnContext(ctx, "Unable to read NGINX Plus API response body", "error", err) - return false + return strings.Contains(body, "Active connections") && strings.Contains(body, "server accepts handled requests") } - // Expecting API to return the API versions in an array of positive integers // subset example: [ ... 6,7,8,9 ...] var responseBody []int @@ -516,11 +515,12 @@ func (ncp *NginxConfigParser) pingPlusAPIEndpoint(ctx context.Context, statusAPI return true } -func (ncp *NginxConfigParser) urlsForLocationDirective( +// nolint: revive +func (ncp *NginxConfigParser) urlsForLocationDirectiveAPIDetails( parent, current *crossplane.Directive, locationDirectiveName string, -) []string { - var urls []string +) []*model.APIDetails { + var urls []*model.APIDetails // process from the location block if current.Directive != locationDirective { return urls @@ -534,10 +534,28 @@ func (ncp *NginxConfigParser) urlsForLocationDirective( addresses := ncp.parseAddressesFromServerDirective(parent) for _, address := range addresses { + format := unixStubStatusFormat + + if locChild.Directive == plusAPIDirective { + format = unixPlusAPIFormat + } + path := ncp.parsePathFromLocationDirective(current) if locChild.Directive == locationDirectiveName { - urls = append(urls, fmt.Sprintf(apiFormat, address, path)) + if strings.HasPrefix(address, "unix:") { + urls = append(urls, &model.APIDetails{ + URL: fmt.Sprintf(format, path), + Listen: address, + Location: path, + }) + } else { + urls = append(urls, &model.APIDetails{ + URL: fmt.Sprintf(apiFormat, address, path), + Listen: address, + Location: path, + }) + } } } } @@ -633,3 +651,14 @@ func (ncp *NginxConfigParser) isPort(value string) bool { return err == nil && port >= 1 && port <= 65535 } + +func (ncp *NginxConfigParser) SocketClient(socketPath string) http.Client { + return http.Client{ + Timeout: ncp.agentConfig.Client.Timeout, + Transport: &http.Transport{ + DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { + return net.Dial("unix", socketPath) + }, + }, + } +} diff --git a/internal/watcher/instance/nginx_config_parser_test.go b/internal/watcher/instance/nginx_config_parser_test.go index e4c493e530..36f08c4a98 100644 --- a/internal/watcher/instance/nginx_config_parser_test.go +++ b/internal/watcher/instance/nginx_config_parser_test.go @@ -15,19 +15,20 @@ import ( "strings" "testing" + "github.com/google/go-cmp/cmp" + "github.com/nginx/agent/v3/internal/model" + "github.com/nginx/agent/v3/pkg/files" + "google.golang.org/protobuf/testing/protocmp" + "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" testconfig "github.com/nginx/agent/v3/test/config" "github.com/nginx/agent/v3/test/helpers" modelHelpers "github.com/nginx/agent/v3/test/model" "github.com/nginx/agent/v3/test/protos" "github.com/nginx/agent/v3/test/types" crossplane "github.com/nginxinc/nginx-go-crossplane" - "google.golang.org/protobuf/testing/protocmp" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -242,6 +243,23 @@ var ( api; } }` + + testConf20 = `server { + listen unix:/var/run/nginx/nginx-status.sock; + location /stub_status { + stub_status; + } +} +` + testConf21 = `server { + listen unix:/var/run/nginx/nginx-plus-api.sock; + access_log off; + + location /api { + api write=on; + } + } +` ) func TestNginxConfigParser_Parse(t *testing.T) { @@ -312,7 +330,7 @@ func TestNginxConfigParser_Parse(t *testing.T) { result, parseError := nginxConfig.Parse(ctx, test.instance) require.NoError(t, parseError) - if diff := cmp.Diff(expectedConfigContext, result, protocmp.Transform()); diff != "" { + if diff := cmp.Diff(expectedConfigContext.AccessLogs, result.AccessLogs, protocmp.Transform()); diff != "" { t.Errorf("\n%v", diff) } }) @@ -346,155 +364,322 @@ func TestNginxConfigParser_sslCert(t *testing.T) { ctx := context.Background() dir := t.TempDir() - file1 := helpers.CreateFileWithErrorCheck(t, dir, "nginx-1.conf") - defer helpers.RemoveFileWithErrorCheck(t, file1.Name()) + _, cert := helpers.GenerateSelfSignedCert(t) + + certContents := helpers.Cert{Name: "nginx.cert", Type: "CERTIFICATE", Contents: cert} + + certFile := helpers.WriteCertFiles(t, dir, certContents) + require.NotNil(t, certFile) // Not in allowed directory nginxConfig := NewNginxConfigParser(types.AgentConfig()) nginxConfig.agentConfig.AllowedDirectories = []string{} - sslCert := nginxConfig.sslCert(ctx, file1.Name(), dir) + sslCert := nginxConfig.sslCert(ctx, certFile, dir) assert.Nil(t, sslCert) // In allowed directory nginxConfig.agentConfig.AllowedDirectories = []string{dir} - sslCert = nginxConfig.sslCert(ctx, file1.Name(), dir) - assert.Equal(t, file1.Name(), sslCert.GetFileMeta().GetName()) + sslCert = nginxConfig.sslCert(ctx, certFile, dir) + assert.Equal(t, certFile, sslCert.GetFileMeta().GetName()) } +// nolint: maintidx func TestNginxConfigParser_urlsForLocationDirective(t *testing.T) { tmpDir := t.TempDir() for _, tt := range []struct { + name string conf string - oss []string - plus []string + oss []*model.APIDetails + plus []*model.APIDetails }{ { - plus: []string{ - "http://127.0.0.1:80/api/", - "http://localhost:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:80/api/", + Listen: "127.0.0.1:80", + Location: "/api/", + }, + { + URL: "http://localhost:80/api/", + Listen: "localhost:80", + Location: "/api/", + }, }, + name: "Test 1: listen localhost 80, allow 127.0.0.1 - Plus", conf: testConf01, }, { - plus: []string{ - "http://127.0.0.1:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:80/api/", + Listen: "127.0.0.1:80", + Location: "/api/", + }, }, + name: "Test 2: listen *:80 - Plus", conf: testConf02, }, { - plus: []string{ - "http://127.0.0.1:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:80/api/", + Listen: "127.0.0.1:80", + Location: "/api/", + }, }, + name: "Test 3: server_name _ - Plus", conf: testConf03, }, { - plus: []string{ - "http://127.0.0.1:8888/api/", - "http://status.internal.com:8888/api/", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:8888/api/", + Listen: "127.0.0.1:8888", + Location: "/api/", + }, + { + URL: "http://status.internal.com:8888/api/", + Listen: "status.internal.com:8888", + Location: "/api/", + }, }, + name: "Test 4: server_name status.internal.com - Plus", conf: testConf04, }, { - plus: []string{ - "http://127.0.0.1:8080/privateapi", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:8080/privateapi", + Listen: "127.0.0.1:8080", + Location: "/privateapi", + }, }, + name: "Test 5: location /privateapi - Plus", conf: testConf05, }, { - plus: []string{ - "http://127.0.0.1:80/api/", - "http://[::1]:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:80/api/", + Listen: "127.0.0.1:80", + Location: "/api/", + }, + { + URL: "http://[::1]:80/api/", + Listen: "[::1]:80", + Location: "/api/", + }, }, + name: "Test 6: listen [::]:80 default_server - Plus", conf: testConf06, }, { - plus: []string{ - "http://127.0.0.1:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:80/api/", + Listen: "127.0.0.1:80", + Location: "/api/", + }, }, + name: "Test 7: listen 127.0.0.1, server_name _ - Plus", conf: testConf07, }, { - plus: []string{ - "http://127.0.0.1:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:80/api/", + Listen: "127.0.0.1:80", + Location: "/api/", + }, }, + name: "Test 8: location = /api/, listen 127.0.0.1 - Plus", conf: testConf08, }, { - plus: []string{ - "http://127.0.0.1:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:80/api/", + Listen: "127.0.0.1:80", + Location: "/api/", + }, }, + name: "Test 9: location = /api/ , listen 80 - Plus", conf: testConf09, }, { - plus: []string{ - "http://127.0.0.1:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:80/api/", + Listen: "127.0.0.1:80", + Location: "/api/", + }, }, + name: "Test 10: listen :80 - Plus", conf: testConf10, }, { - plus: []string{ - "http://localhost:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://localhost:80/api/", + Listen: "localhost:80", + Location: "/api/", + }, }, + name: "Test 11: listen localhost - Plus", conf: testConf11, }, { - plus: []string{ - "http://[::1]:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://[::1]:80/api/", + Listen: "[::1]:80", + Location: "/api/", + }, }, + name: "Test 12: listen [::1] - Plus", conf: testConf12, }, { - plus: []string{ - "http://[::1]:8000/api/", + plus: []*model.APIDetails{ + { + URL: "http://[::1]:8000/api/", + Listen: "[::1]:8000", + Location: "/api/", + }, }, + name: "Test 13: listen [::]:8000 - Plus", conf: testConf13, }, { - oss: []string{ - "http://localhost:80/stub_status", - "http://127.0.0.1:80/stub_status", + oss: []*model.APIDetails{ + { + URL: "http://localhost:80/stub_status", + Listen: "localhost:80", + Location: "/stub_status", + }, + { + URL: "http://127.0.0.1:80/stub_status", + Listen: "127.0.0.1:80", + Location: "/stub_status", + }, }, + name: "Test 14: listen 127.0.0.1:80, server_name localhost - OSS", conf: testConf14, }, { - oss: []string{ - "http://localhost:80/stub_status", - "http://127.0.0.1:80/stub_status", + oss: []*model.APIDetails{ + { + URL: "http://localhost:80/stub_status", + Listen: "localhost:80", + Location: "/stub_status", + }, + { + URL: "http://127.0.0.1:80/stub_status", + Listen: "127.0.0.1:80", + Location: "/stub_status", + }, }, + name: "Test 15: listen :80, server_name localhost - OSS", conf: testConf15, }, { - oss: []string{ - "http://localhost:80/stub_status", - "http://127.0.0.1:80/stub_status", + oss: []*model.APIDetails{ + { + URL: "http://localhost:80/stub_status", + Listen: "localhost:80", + Location: "/stub_status", + }, + { + URL: "http://127.0.0.1:80/stub_status", + Listen: "127.0.0.1:80", + Location: "/stub_status", + }, }, + name: "Test 16: listen 80, server_name localhost - OSS", conf: testConf16, }, { - oss: []string{ - "http://localhost:80/stub_status", - "http://127.0.0.1:80/stub_status", + oss: []*model.APIDetails{ + { + URL: "http://localhost:80/stub_status", + Listen: "localhost:80", + Location: "/stub_status", + }, + { + URL: "http://127.0.0.1:80/stub_status", + Listen: "127.0.0.1:80", + Location: "/stub_status", + }, }, + name: "Test 17: location = /stub_status - OSS", conf: testConf17, }, { - oss: []string{ - "http://localhost:80/stub_status", - "http://127.0.0.1:80/stub_status", + oss: []*model.APIDetails{ + { + URL: "http://localhost:80/stub_status", + Listen: "localhost:80", + Location: "/stub_status", + }, + { + URL: "http://127.0.0.1:80/stub_status", + Listen: "127.0.0.1:80", + Location: "/stub_status", + }, }, - plus: []string{ - "http://localhost:80/api/", - "http://127.0.0.1:80/api/", + plus: []*model.APIDetails{ + { + URL: "http://localhost:80/api/", + Listen: "localhost:80", + Location: "/api/", + }, + { + URL: "http://127.0.0.1:80/api/", + Listen: "127.0.0.1:80", + Location: "/api/", + }, }, + name: "Test 18: listen 80 - OSS & Plus", conf: testConf18, }, { - plus: []string{ - "http://127.0.0.1:49151/api", - "http://127.0.0.1:49151/api", + plus: []*model.APIDetails{ + { + URL: "http://127.0.0.1:49151/api", + Listen: "127.0.0.1:49151", + Location: "/api", + }, + { + URL: "http://127.0.0.1:49151/api", + Listen: "127.0.0.1:49151", + Location: "/api", + }, }, + name: "Test 19: listen 127.0.0.1:49151 - Plus", conf: testConf19, }, + { + oss: []*model.APIDetails{ + { + URL: "http://config-status/stub_status", + Listen: "unix:/var/run/nginx/nginx-status.sock", + Location: "/stub_status", + }, + }, + name: "Test 20: unix:/var/run/nginx/nginx-status.sock - OSS Unix Socket", + conf: testConf20, + }, + { + plus: []*model.APIDetails{ + { + URL: "http://nginx-plus-api/api", + Listen: "unix:/var/run/nginx/nginx-plus-api.sock", + Location: "/api", + }, + }, + name: "Test 21: listen unix:/var/run/nginx/nginx-plus-api.sock- Plus Unix Socket", + conf: testConf21, + }, } { ctx := context.Background() f, err := os.CreateTemp(tmpDir, "conf") @@ -509,17 +694,18 @@ func TestNginxConfigParser_urlsForLocationDirective(t *testing.T) { payload, err := crossplane.Parse(f.Name(), parseOptions) require.NoError(t, err) - nginxConfigParser := NewNginxConfigParser(types.AgentConfig()) + ncp := NewNginxConfigParser(types.AgentConfig()) - var oss, plus []string + var oss, plus []*model.APIDetails assert.Len(t, payload.Config, 1) for _, xpConf := range payload.Config { assert.Len(t, xpConf.Parsed, 1) - err = nginxConfigParser.crossplaneConfigTraverse(ctx, &xpConf, + err = ncp.crossplaneConfigTraverse(ctx, &xpConf, func(ctx context.Context, parent, directive *crossplane.Directive) error { - _oss := nginxConfigParser.urlsForLocationDirective(parent, directive, stubStatusAPIDirective) - _plus := nginxConfigParser.urlsForLocationDirective(parent, directive, plusAPIDirective) + _oss := ncp.urlsForLocationDirectiveAPIDetails(parent, directive, + stubStatusAPIDirective) + _plus := ncp.urlsForLocationDirectiveAPIDetails(parent, directive, plusAPIDirective) oss = append(oss, _oss...) plus = append(plus, _plus...) @@ -535,7 +721,7 @@ func TestNginxConfigParser_urlsForLocationDirective(t *testing.T) { // linter doesn't like the duplicate handler and server function // nolint: dupl -func TestNginxConfigParser_pingPlusAPIEndpoint(t *testing.T) { +func TestNginxConfigParser_pingAPIEndpoint_PlusAPI(t *testing.T) { handler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { if req.URL.String() == "/good_api" { data := []byte("[1,2,3,4,5,6,7,8]") @@ -586,7 +772,10 @@ func TestNginxConfigParser_pingPlusAPIEndpoint(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { ctx := context.Background() - result := nginxConfigParser.pingPlusAPIEndpoint(ctx, fmt.Sprintf("%s%s", fakeServer.URL, test.endpoint)) + result := nginxConfigParser.pingAPIEndpoint(ctx, &model.APIDetails{ + URL: fmt.Sprintf("%s%s", fakeServer.URL, test.endpoint), + Listen: "", + }, "api") assert.Equal(t, test.expected, result) }) } @@ -594,7 +783,7 @@ func TestNginxConfigParser_pingPlusAPIEndpoint(t *testing.T) { // linter doesn't like the duplicate handler and server function // nolint: dupl -func TestNginxConfigParser_pingStubStatusAPIEndpoint(t *testing.T) { +func TestNginxConfigParser_pingAPIEndpoint_StubStatus(t *testing.T) { handler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { if req.URL.String() == "/good_api" { data := []byte(` @@ -653,8 +842,11 @@ Reading: 0 Writing: 1 Waiting: 1 for _, test := range tests { t.Run(test.name, func(t *testing.T) { ctx := context.Background() - statusAPI := fmt.Sprintf("%s%s", fakeServer.URL, test.endpoint) - result := nginxConfigParser.pingStubStatusAPIEndpoint(ctx, statusAPI) + statusAPI := &model.APIDetails{ + URL: fmt.Sprintf("%s%s", fakeServer.URL, test.endpoint), + Listen: "", + } + result := nginxConfigParser.pingAPIEndpoint(ctx, statusAPI, "stub_status") assert.Equal(t, test.expected, result) }) } diff --git a/internal/watcher/instance/nginx_process_parser.go b/internal/watcher/instance/nginx_process_parser.go index e88fac4e5b..7ad875af12 100644 --- a/internal/watcher/instance/nginx_process_parser.go +++ b/internal/watcher/instance/nginx_process_parser.go @@ -204,7 +204,10 @@ func convertInfoToInstance(nginxInfo Info) *mpi.Instance { ConfigPath: nginxInfo.ConfPath, Details: &mpi.InstanceRuntime_NginxRuntimeInfo{ NginxRuntimeInfo: &mpi.NGINXRuntimeInfo{ - StubStatus: "", + StubStatus: &mpi.APIDetails{ + Location: "", + Listen: "", + }, AccessLogs: []string{}, ErrorLogs: []string{}, LoadableModules: nginxInfo.LoadableModules, @@ -219,12 +222,18 @@ func convertInfoToInstance(nginxInfo Info) *mpi.Instance { ConfigPath: nginxInfo.ConfPath, Details: &mpi.InstanceRuntime_NginxPlusRuntimeInfo{ NginxPlusRuntimeInfo: &mpi.NGINXPlusRuntimeInfo{ - StubStatus: "", + StubStatus: &mpi.APIDetails{ + Location: "", + Listen: "", + }, AccessLogs: []string{}, ErrorLogs: []string{}, LoadableModules: nginxInfo.LoadableModules, DynamicModules: nginxInfo.DynamicModules, - PlusApi: "", + PlusApi: &mpi.APIDetails{ + Location: "", + Listen: "", + }, }, }, } diff --git a/internal/watcher/watcher_plugin.go b/internal/watcher/watcher_plugin.go index 5d1e14cd97..5c7a68cf7e 100644 --- a/internal/watcher/watcher_plugin.go +++ b/internal/watcher/watcher_plugin.go @@ -219,7 +219,8 @@ func (w *Watcher) monitorWatchers(ctx context.Context) { ) w.messagePipe.Process( newCtx, - &bus.Message{Topic: bus.NginxConfigUpdateTopic, Data: message.NginxConfigContext}, + &bus.Message{Topic: bus. + NginxConfigUpdateTopic, Data: message.NginxConfigContext}, ) } else { slog.DebugContext( diff --git a/internal/watcher/watcher_plugin_test.go b/internal/watcher/watcher_plugin_test.go index 9cca5d80d4..c4b74d09a7 100644 --- a/internal/watcher/watcher_plugin_test.go +++ b/internal/watcher/watcher_plugin_test.go @@ -10,6 +10,8 @@ import ( "testing" "time" + "github.com/nginx/agent/v3/internal/bus/busfakes" + "github.com/google/uuid" "google.golang.org/protobuf/types/known/timestamppb" @@ -32,7 +34,7 @@ func TestWatcher_Init(t *testing.T) { watcherPlugin := NewWatcher(types.AgentConfig()) - messagePipe := bus.NewFakeMessagePipe() + messagePipe := busfakes.NewFakeMessagePipe() err := watcherPlugin.Init(ctx, messagePipe) defer func() { diff --git a/pkg/files/file_helpers.go b/pkg/files/file_helpers.go index 6393a1fe1e..f4059b15c8 100644 --- a/pkg/files/file_helpers.go +++ b/pkg/files/file_helpers.go @@ -8,7 +8,9 @@ package files import ( "cmp" + "crypto/x509" "fmt" + "net" "os" "slices" "strconv" @@ -16,10 +18,11 @@ import ( "github.com/google/uuid" mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" + "github.com/nginx/agent/v3/internal/datasource/cert" "google.golang.org/protobuf/types/known/timestamppb" ) -const permissions = 0o644 +const permissions = 0o600 // FileMeta returns a proto FileMeta struct from a given file path. func FileMeta(filePath string) (*mpi.FileMeta, error) { @@ -34,14 +37,70 @@ func FileMeta(filePath string) (*mpi.FileMeta, error) { } fileHash := GenerateHash(content) - - return &mpi.FileMeta{ + fileMeta := &mpi.FileMeta{ Name: filePath, Hash: fileHash, ModifiedTime: timestamppb.New(fileInfo.ModTime()), Permissions: Permissions(fileInfo.Mode()), Size: fileInfo.Size(), - }, nil + } + + return fileMeta, nil +} + +// FileMetaWithCertificate returns a FileMeta struct with certificate metadata if applicable. +func FileMetaWithCertificate(filePath string) (*mpi.FileMeta, error) { + fileMeta, err := FileMeta(filePath) + if err != nil { + return nil, err + } + + loadedCert, certErr := cert.LoadCertificate(filePath) + if certErr != nil { + // If it's not a certificate, just return the base file metadata. + return fileMeta, certErr + } + + // Populate certificate-specific metadata + fileMeta.FileType = &mpi.FileMeta_CertificateMeta{ + CertificateMeta: &mpi.CertificateMeta{ + SerialNumber: loadedCert.SerialNumber.Bytes(), + Issuer: &mpi.X509Name{ + Country: loadedCert.Issuer.Country, + Organization: loadedCert.Issuer.Organization, + OrganizationalUnit: loadedCert.Issuer.OrganizationalUnit, + Locality: loadedCert.Issuer.Locality, + Province: loadedCert.Issuer.Province, + StreetAddress: loadedCert.Issuer.StreetAddress, + PostalCode: loadedCert.Issuer.PostalCode, + SerialNumber: loadedCert.Issuer.SerialNumber, + CommonName: loadedCert.Issuer.CommonName, + }, + Subject: &mpi.X509Name{ + Country: loadedCert.Subject.Country, + Organization: loadedCert.Subject.Organization, + OrganizationalUnit: loadedCert.Subject.OrganizationalUnit, + Locality: loadedCert.Subject.Locality, + Province: loadedCert.Subject.Province, + StreetAddress: loadedCert.Subject.StreetAddress, + PostalCode: loadedCert.Subject.PostalCode, + SerialNumber: loadedCert.Subject.SerialNumber, + CommonName: loadedCert.Subject.CommonName, + }, + Sans: &mpi.SubjectAlternativeNames{ + DnsNames: loadedCert.DNSNames, + IpAddresses: convertIPBytes(loadedCert.IPAddresses), + }, + Dates: &mpi.CertificateDates{ + NotBefore: loadedCert.NotBefore.Unix(), + NotAfter: loadedCert.NotAfter.Unix(), + }, + SignatureAlgorithm: convertX509SignatureAlgorithm(loadedCert.SignatureAlgorithm), + PublicKeyAlgorithm: loadedCert.PublicKeyAlgorithm.String(), + }, + } + + return fileMeta, nil } // Permissions returns a file's permissions as a string. @@ -88,3 +147,40 @@ func ConvertToMapOfFiles(files []*mpi.File) map[string]*mpi.File { return filesMap } + +func convertIPBytes(ips []net.IP) []string { + stringArray := make([]string, len(ips)) + + for i, byteArray := range ips { + stringArray[i] = string(byteArray) + } + + return stringArray +} + +func convertX509SignatureAlgorithm(alg x509.SignatureAlgorithm) mpi.SignatureAlgorithm { + x509ToMpiSignatureMap := map[x509.SignatureAlgorithm]mpi.SignatureAlgorithm{ + x509.MD2WithRSA: mpi.SignatureAlgorithm_MD2_WITH_RSA, + x509.MD5WithRSA: mpi.SignatureAlgorithm_MD5_WITH_RSA, + x509.SHA1WithRSA: mpi.SignatureAlgorithm_SHA1_WITH_RSA, + x509.SHA256WithRSA: mpi.SignatureAlgorithm_SHA256_WITH_RSA, + x509.SHA384WithRSA: mpi.SignatureAlgorithm_SHA384_WITH_RSA, + x509.SHA512WithRSA: mpi.SignatureAlgorithm_SHA512_WITH_RSA, + x509.DSAWithSHA1: mpi.SignatureAlgorithm_DSA_WITH_SHA1, + x509.DSAWithSHA256: mpi.SignatureAlgorithm_DSA_WITH_SHA256, + x509.ECDSAWithSHA1: mpi.SignatureAlgorithm_ECDSA_WITH_SHA1, + x509.ECDSAWithSHA256: mpi.SignatureAlgorithm_ECDSA_WITH_SHA256, + x509.ECDSAWithSHA384: mpi.SignatureAlgorithm_ECDSA_WITH_SHA384, + x509.ECDSAWithSHA512: mpi.SignatureAlgorithm_ECDSA_WITH_SHA512, + x509.SHA256WithRSAPSS: mpi.SignatureAlgorithm_SHA256_WITH_RSA_PSS, + x509.SHA384WithRSAPSS: mpi.SignatureAlgorithm_SHA384_WITH_RSA_PSS, + x509.SHA512WithRSAPSS: mpi.SignatureAlgorithm_SHA512_WITH_RSA_PSS, + x509.PureEd25519: mpi.SignatureAlgorithm_PURE_ED25519, + x509.UnknownSignatureAlgorithm: mpi.SignatureAlgorithm_SIGNATURE_ALGORITHM_UNKNOWN, + } + if mappedAlg, exists := x509ToMpiSignatureMap[alg]; exists { + return mappedAlg + } + + return mpi.SignatureAlgorithm_SIGNATURE_ALGORITHM_UNKNOWN +} diff --git a/pkg/files/file_helpers_test.go b/pkg/files/file_helpers_test.go index 4a2dcc9281..9e1baba1e1 100644 --- a/pkg/files/file_helpers_test.go +++ b/pkg/files/file_helpers_test.go @@ -6,6 +6,8 @@ package files import ( + "crypto/x509" + "net" "os" "testing" @@ -20,26 +22,55 @@ import ( ) func TestGetFileMeta(t *testing.T) { - file, err := os.CreateTemp(t.TempDir(), "get_file_meta.txt") - defer helpers.RemoveFileWithErrorCheck(t, file.Name()) - require.NoError(t, err) + tests := []struct { + name string + isCert bool + }{ + {"Test 1: conf file", false}, + {"Test 2: cert file", true}, + } - expected := protos.FileMeta(file.Name(), GenerateHash([]byte(""))) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tempDir := t.TempDir() - fileMeta, err := FileMeta(file.Name()) - require.NoError(t, err) + var err error + var fileMeta, expected *mpi.FileMeta + var file *os.File + + if tt.isCert { + _, cert := helpers.GenerateSelfSignedCert(t) + + certContents := helpers.Cert{Name: "cert.pem", Type: "CERTIFICATE", Contents: cert} + certFile := helpers.WriteCertFiles(t, tempDir, certContents) - assert.Equal(t, expected.GetName(), fileMeta.GetName()) - assert.Equal(t, expected.GetHash(), fileMeta.GetHash()) - assert.Equal(t, expected.GetPermissions(), fileMeta.GetPermissions()) - assert.Equal(t, expected.GetSize(), fileMeta.GetSize()) - assert.NotNil(t, fileMeta.GetModifiedTime()) + require.NoError(t, err) + expected = protos.CertMeta(certFile, "") + fileMeta, err = FileMetaWithCertificate(certFile) + } else { + file = helpers.CreateFileWithErrorCheck(t, tempDir, "get_file_meta.txt") + expected = protos.FileMeta(file.Name(), "") + fileMeta, err = FileMeta(file.Name()) + } + + require.NoError(t, err) + + // Validate metadata + assert.Equal(t, expected.GetName(), fileMeta.GetName()) + assert.NotEmpty(t, fileMeta.GetHash()) + assert.Equal(t, expected.GetPermissions(), fileMeta.GetPermissions()) + assert.NotNil(t, fileMeta.GetModifiedTime()) + + if file != nil { + helpers.RemoveFileWithErrorCheck(t, file.Name()) + } + }) + } } func TestGetPermissions(t *testing.T) { - file, err := os.CreateTemp(t.TempDir(), "get_permissions_test.txt") + file := helpers.CreateFileWithErrorCheck(t, os.TempDir(), "get_permissions_test.txt") defer helpers.RemoveFileWithErrorCheck(t, file.Name()) - require.NoError(t, err) info, err := os.Stat(file.Name()) require.NoError(t, err) @@ -135,3 +166,64 @@ func TestGenerateHash(t *testing.T) { }) } } + +func TestConvertIpBytes(t *testing.T) { + tests := []struct { + input []net.IP + expected []string + }{ + { + input: []net.IP{net.IPv4(192, 168, 0, 1), net.IPv4(10, 0, 0, 1)}, + expected: []string{ + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc0\xa8\x00\x01", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\n\x00\x00\x01", + }, + }, + { + input: []net.IP{net.ParseIP("2001:0db8::68")}, + expected: []string{" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00h"}, + }, + { + input: []net.IP{}, + expected: []string{}, + }, + } + + for _, test := range tests { + result := convertIPBytes(test.input) + for i := range result { + assert.Equal(t, test.expected[i], result[i]) + } + } +} + +func TestConvertX509SignatureAlgorithm(t *testing.T) { + tests := []struct { + input x509.SignatureAlgorithm + expected mpi.SignatureAlgorithm + }{ + {x509.MD2WithRSA, mpi.SignatureAlgorithm_MD2_WITH_RSA}, + {x509.MD5WithRSA, mpi.SignatureAlgorithm_MD5_WITH_RSA}, + {x509.SHA1WithRSA, mpi.SignatureAlgorithm_SHA1_WITH_RSA}, + {x509.SHA256WithRSA, mpi.SignatureAlgorithm_SHA256_WITH_RSA}, + {x509.SHA384WithRSA, mpi.SignatureAlgorithm_SHA384_WITH_RSA}, + {x509.SHA512WithRSA, mpi.SignatureAlgorithm_SHA512_WITH_RSA}, + {x509.DSAWithSHA1, mpi.SignatureAlgorithm_DSA_WITH_SHA1}, + {x509.DSAWithSHA256, mpi.SignatureAlgorithm_DSA_WITH_SHA256}, + {x509.ECDSAWithSHA1, mpi.SignatureAlgorithm_ECDSA_WITH_SHA1}, + {x509.ECDSAWithSHA256, mpi.SignatureAlgorithm_ECDSA_WITH_SHA256}, + {x509.ECDSAWithSHA384, mpi.SignatureAlgorithm_ECDSA_WITH_SHA384}, + {x509.ECDSAWithSHA512, mpi.SignatureAlgorithm_ECDSA_WITH_SHA512}, + {x509.SHA256WithRSAPSS, mpi.SignatureAlgorithm_SHA256_WITH_RSA_PSS}, + {x509.SHA384WithRSAPSS, mpi.SignatureAlgorithm_SHA384_WITH_RSA_PSS}, + {x509.SHA512WithRSAPSS, mpi.SignatureAlgorithm_SHA512_WITH_RSA_PSS}, + {x509.PureEd25519, mpi.SignatureAlgorithm_PURE_ED25519}, + {x509.UnknownSignatureAlgorithm, mpi.SignatureAlgorithm_SIGNATURE_ALGORITHM_UNKNOWN}, + } + + for _, test := range tests { + t.Run(test.input.String(), func(t *testing.T) { + assert.Equal(t, test.expected, convertX509SignatureAlgorithm(test.input)) + }) + } +} diff --git a/scripts/testing/otel-collector.yaml b/scripts/testing/otel-collector.yaml index 208f0e4d39..6196a1591b 100644 --- a/scripts/testing/otel-collector.yaml +++ b/scripts/testing/otel-collector.yaml @@ -6,6 +6,7 @@ receivers: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 + # prometheus: # config: # scrape_configs: diff --git a/site/content/_index.md b/site/content/_index.md index ac81454ba1..b3764d9169 100644 --- a/site/content/_index.md +++ b/site/content/_index.md @@ -1,6 +1,6 @@ --- -title: "Welcome to the NGINX Agent documentation" -description: "NGINX Agent is a companion daemon for your NGINX Open Source or NGINX Plus instance." -linkTitle: "NGINX Agent" -menu: docs ---- \ No newline at end of file +title: "NGINX Agent Documentation" +weight: 900 +--- + +NGINX Agent is a companion daemon for your NGINX Open Source or NGINX Plus instance \ No newline at end of file diff --git a/site/content/previous-versions/NGINX-agent-v2/overview.md b/site/content/about.md similarity index 68% rename from site/content/previous-versions/NGINX-agent-v2/overview.md rename to site/content/about.md index a46f1b1dee..02778fc1d6 100644 --- a/site/content/previous-versions/NGINX-agent-v2/overview.md +++ b/site/content/about.md @@ -1,14 +1,12 @@ --- -title: "Overview" -draft: false +title: "About" weight: 100 toc: true -tags: [ "docs" ] -docs: "DOCS-1091" -categories: ["configuration"] -doctypes: ["task"] +docs: DOCS-000 --- +This page provides a brief overview of what F5 NGINX Agent is, and how it works. + ## Overview NGINX Agent is a companion daemon for your NGINX Open Source or NGINX Plus instance. It enables: @@ -17,37 +15,57 @@ 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 +[OpenTelemetry](https://opentelemetry.io/) support comes with NGINX Agent v3, and the ability to [export the metrics data]({{< relref "/how-to/export-metrics.md" >}}) for use in other applications. + +For an overview of the metrics available from NGINX Agent, read the following topics: + +- [OpenTelemetry metrics]({{< relref "/metrics.md" >}}) (Agent v3) +- [Metrics]({{< relref "/v2/metrics.md" >}}) (Agent v2) -{{< img src="grafana-dashboard-example.png" caption="Grafana dashboard showing metrics reported by NGINX Agent" alt="Grafana dashboard showing metrics reported by NGINX Agent" width="99%">}} -## How it Works +{{< img src="grafana-dashboard-example.png" caption="A Grafana dashboard displaying metrics reported by NGINX Agent." alt="A Grafana dashboard displaying metrics reported by NGINX Agent.">}} + +--- -NGINX Agent runs as a companion process on a system running NGINX. It provides gRPC and REST interfaces for configuration management and metrics collection from the NGINX process and operating system. NGINX Agent enables remote interaction with NGINX using common Linux tools and unlocks the ability to build sophisticated monitoring and control systems that can manage large collections of NGINX instances. +## How it works + +NGINX Agent runs as a companion process on a system running NGINX. It provides gRPC and REST interfaces for configuration management and metrics collection from the NGINX process and operating system. + +NGINX Agent enables remote interaction with NGINX using common Linux tools and unlocks the ability to build sophisticated monitoring and control systems that can manage large collections of NGINX instances. {{< img src="agent-flow.png" caption="How Agent works" alt="How NGINX Agent works" width="99%">}} -## Configuration Management +## Configuration management NGINX Agent provides an API interface for submission of updated configuration files. Upon receipt of a new file, it checks the output of `nginx -V` to determine the location of existing configurations. It then validates the new configuration with `nginx -t` before applying it via a signal HUP to the NGINX master process. -## Collecting Metrics +For additional information, view the [Configuration overview]({{< relref "/how-to/configuration-overview.md" >}}) topic. + +--- + +## Collecting metrics NGINX Agent interfaces with NGINX process information and parses NGINX logs to calculate and report metrics. When interfacing with NGINX Plus, NGINX Agent pulls relevant information from the NGINX Plus API. Reported metrics may be aggregated by [Prometheus](https://prometheus.io/) and visualized with tools like [Grafana](https://grafana.com/). +--- + ### NGINX Open Source When running alongside an open source instance of NGINX, NGINX Agent requires that NGINX Access and Error logs are turned on and contain all default variables. +--- + ### NGINX Plus -For NGINX Agent to work properly with an NGINX Plus instance, the API needs to be configured in that instance's nginx.conf. See [Instance Metrics Overview](https://docs.nginx.com/nginx-management-suite/nim/about/overview-metrics/) for more details. Once NGINX Plus is configured with the `/api/` endpoint, the Agent will automatically use it on startup. +For NGINX Agent to work properly with an NGINX Plus instance, the API needs to be configured in that instance's nginx.conf. View the [Instance Metrics Overview](https://docs.nginx.com/nginx-management-suite/nim/about/overview-metrics/) topic for more details. Once NGINX Plus is configured with the `/api/` endpoint, the Agent will automatically use it on startup. + +--- -## Event Notifications +## Event notifications NGINX Agent allows a gRPC connected control system to register a listener for a specific event. The control mechanism is then invoked when NGINX Agent sends an associated system signal. The source of a notification can be either the NGINX instance or NGINX Agent itself. Here's a list of currently supported events: - {{< raw-html>}}
++ ++ NGINX Agent v3 is available!+
+ This documentation is for NGINX Agent v2. We suggest reading the Migrate from NGINX Agent v2 to v3 topic to learn the differences between the two versions, and learn how to upgrade your instances. +
{{ .Description | markdownify }}
{{ end}} + + {{ if in .Params.doctypes "beta" }}{{ partial "beta-badge" . }}{{ end }} + + {{ .Content }} + {{ partial "version-list" . }} ++ {{ .Description | markdownify }} +
+ {{ end}} +++ {{ if .Content }} ++ NGINX Agent v3 is available!+
+ This documentation is for NGINX Agent v2. We suggest reading the Migrate from NGINX Agent v2 to v3 topic to learn the differences between the two versions, and learn how to upgrade your instances. +
+ {{ .Content | markdownify }} +
+ {{ end }} ++ {{ if .Description }}{{ .Description | markdownify }}{{ end }} +
{{*/}} + +description | +{{.description}} | +
type | +{{.type}} | +
categories | +{{.categories}} | +
source | +{{.source}} | +
rollup_aggregate | +{{.rollup_aggregate}} | +
unit | +{{.unit}} | +
aggregations | ++ {{ range .aggregations }} + {{ . }}; + {{end}} + | +
dimensions | +
+ {{ range sort .dimensions }}
+ |
+