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>}}
{{}} {{}} | Event | Description | diff --git a/site/content/changelog.md b/site/content/changelog.md index 8da814d0ea..07f23553fb 100644 --- a/site/content/changelog.md +++ b/site/content/changelog.md @@ -1,6 +1,6 @@ --- title: "Changelog" -weight: 1200 +weight: 700 toc: true --- diff --git a/site/content/configuration/_index.md b/site/content/configuration/_index.md deleted file mode 100644 index 3d1fdf4e34..0000000000 --- a/site/content/configuration/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Configuration" -description: "Learn how to configure NGINX Agent." -linkTitle: "Configuration" -weight: "400" -menu: docs ---- \ No newline at end of file diff --git a/site/content/configuration/configuration-overview.md b/site/content/configuration/configuration-overview.md deleted file mode 100644 index 66d09b3c71..0000000000 --- a/site/content/configuration/configuration-overview.md +++ /dev/null @@ -1,286 +0,0 @@ ---- -title: "Configuration overview" -draft: false -weight: 100 -toc: true -tags: [ "docs" ] -categories: ["configuration"] -doctypes: ["task"] ---- - -## Overview - -The following sections explain how to configure NGINX Agent using configuration files, CLI flags, and environment variables. - -{{}} - -- NGINX Agent interprets configuration values set by configuration files, CLI flags, and environment variables in the following priorities: - - 1. CLI flags overwrite configuration files and environment variable values. - 2. Environment variables overwrite configuration file values. - 3. Config files are the lowest priority and config settings are superseded if either of the other options is used. - -- You must open any required firewall ports or add SELinux/AppArmor rules for the ports and IPs you want to use. - -{{}} - -### Configure with Config Files - -The default locations of configuration files for NGINX Agent are `/etc/nginx-agent/nginx-agent.conf` and `/var/lib/nginx-agent/agent-dynamic.conf`. The `agent-dynamic.conf` file default location is different for FreeBSD which is located `/var/db/nginx-agent/agent-dynamic.conf`. These files have comments at the top indicating their purpose. - -Examples of the configuration files are provided below: - -
- example nginx-agent.conf - -{{}} -In the following example `nginx-agent.conf` file, you can change the `server.host` and `server.grpcPort` to connect to the control/management plane. -{{}} - -```nginx {hl_lines=[13]} -# -# /etc/nginx-agent/nginx-agent.conf -# -# Configuration file for NGINX Agent. -# -# This file tracks agent configuration values that are meant to be statically set. There -# are additional NGINX Agent configuration values that are set via the API and agent install script -# which can be found in /etc/nginx-agent/agent-dynamic.conf. - -# specify the server grpc port to connect to -server: - # host of the control plane - host: - grpcPort: 443 -# tls options -tls: - # enable tls in the nginx-agent setup for grpcs - # default to enable to connect with secure connection but without client cert for mtls - enable: true - # controls whether the server certificate chain and host name are verified. - # for production use, see instructions for configuring TLS - skip_verify: false -log: - # set log level (panic, fatal, error, info, debug, trace; default "info") - level: info - # set log path. if empty, don't log to file. - path: /var/log/nginx-agent/ -nginx: - # path of NGINX logs to exclude - exclude_logs: "" - # Set to true when NGINX configuration should contain no warnings when performing a configuration apply (nginx -t is used to carry out this check) - treat_warnings_as_errors: false # Default is false -# data plane status message / 'heartbeat' -dataplane: - status: - # poll interval for dataplane status - the frequency the agent will query the dataplane for changes - poll_interval: 30s - # report interval for dataplane status - the maximum duration to wait before syncing dataplane information if no updates have been observed - report_interval: 24h -metrics: - # specify the size of a buffer to build before sending metrics - bulk_size: 20 - # specify metrics poll interval - report_interval: 1m - collection_interval: 15s - mode: aggregated - -# OSS NGINX default config path -# path to aux file dirs can also be added -config_dirs: "/etc/nginx:/usr/local/etc/nginx" - -# Internal queue size -queue_size: 100 - -extensions: - - nginx-app-protect - -# Enable reporting NGINX App Protect details to the control plane. -nginx_app_protect: - # Report interval for NGINX App Protect details - the frequency NGINX Agent checks NGINX App Protect for changes. - report_interval: 15s - # Enable precompiled publication from the NGINX Management Suite (true) or perform compilation on the data plane host (false). - precompiled_publication: true -``` - -
- - -
- example dynamic-agent.conf - -{{}} -Default location in Linux environments: `/var/lib/nginx-agent/agent-dynamic.conf` - -Default location in FreeBSD environments: `/var/db/nginx-agent/agent-dynamic.conf` -{{}} - -```yaml -# Dynamic configuration file for NGINX Agent. -# -# The purpose of this file is to track agent configuration -# values that can be dynamically changed via the API and the agent install script. -# You may edit this file, but API calls that modify the tags on this system will -# overwrite the tag values in this file. -# -# The agent configuration values that API calls can modify are as follows: -# - tags -# -# The agent configuration value that the agent install script can modify are as follows: -# - instance_group - -instance_group: devenv-group -tags: - - devenv - - test -``` - -
- - -### NGINX Agent CLI Flags & Usage {#nginx-agent-cli-flags-usage} - -This section displays the configurable options for NGINX Agent that can be set with CLI flags. See the CLI flags and their uses in the figure below: - -
- NGINX Agent CLI flags & usage - -```text -Usage: - nginx-agent [flags] - nginx-agent [command] - -Available Commands: - completion Generate completion script. - help Help about any command - -Flags: - --api-cert string The cert used by the Agent API. - --api-host string The host used by the Agent API. (default "127.0.0.1") - --api-key string The key used by the Agent API. - --api-port int The desired port to use for nginx-agent to expose for HTTP traffic. - --config-dirs string Defines the paths that you want to grant nginx-agent read/write access to. This key is formatted as a string and follows Unix PATH format. (default "/etc/nginx:/usr/local/etc/nginx:/usr/share/nginx/modules:/etc/nms") - --dataplane-report-interval duration The amount of time the agent will report on the dataplane. After this period of time it will send a snapshot of the dataplane information. (default 24h0m0s) - --dataplane-status-poll-interval duration The frequency the agent will check the dataplane for changes. Used as a "heartbeat" to keep the gRPC connections alive. (default 30s) - --display-name string The instance's 'name' value. - --dynamic-config-path string Defines the path of the Agent dynamic config file. (default "/var/lib/nginx-agent/agent-dynamic.conf") - --features strings A comma-separated list of features enabled for the agent. (default [registration,nginx-config-async,nginx-ssl-config,nginx-counting,metrics,dataplane-status,process-watcher,file-watcher,activity-events,agent-api]) - -h, --help help for nginx-agent - --ignore-directives strings A comma-separated list of ignoring directives which contain sensitive info. - --instance-group string The instance's 'group' value. - --log-level string The desired verbosity level for logging messages from nginx-agent. Available options, in order of severity from highest to lowest, are: panic, fatal, error, info, debug, and trace. (default "info") - --log-path string The path to output log messages to. If the default path doesn't exist, log messages are output to stdout/stderr. - --metrics-bulk-size int The amount of metrics reports collected before sending the data back to the server. (default 20) - --metrics-collection-interval duration Sets the interval, in seconds, at which metrics are collected. (default 15s) - --metrics-mode string Sets the desired metrics collection mode: streaming or aggregation. (default "aggregated") - --metrics-report-interval duration The polling period specified for a single set of metrics being collected. (default 1m0s) - --nginx-config-reload-monitoring-period duration The duration NGINX Agent will monitor error logs after a NGINX reload (default 10s) - --nginx-exclude-logs string One or more NGINX access log paths that you want to exclude from metrics collection. This key is formatted as a string and multiple values should be provided as a comma-separated list. - --nginx-socket string The NGINX Plus counting unix socket location. (default "unix:/var/run/nginx-agent/nginx.sock") - --nginx-treat-warnings-as-errors On nginx -t, treat warnings as failures on configuration application. - --queue-size int The size of the NGINX Agent internal queue. - --server-command string The name of the command server sent in the tls configuration. - --server-grpcport int The desired GRPC port to use for nginx-agent traffic. - --server-host string The IP address of the server host. IPv4 addresses and hostnames are supported. - --server-metrics string The name of the metrics server sent in the tls configuration. - --server-token string An authentication token that grants nginx-agent access to the commander and metrics services. Auto-generated by default. (default "e202f883-54c6-4702-be15-3ba6e507879a") - --tags strings A comma-separated list of tags to add to the current instance or machine, to be used for inventory purposes. - --tls-ca string The path to the CA certificate file to use for TLS. - --tls-cert string The path to the certificate file to use for TLS. - --tls-enable Enables TLS for secure communications. - --tls-key string The path to the certificate key file to use for TLS. - --tls-skip-verify Only intended for demonstration, sets InsecureSkipVerify for gRPC TLS credentials - -v, --version version for nginx-agent - -Use "nginx-agent [command] --help" for more information about a command. -``` - -
- -#### NGINX Agent Config Dirs Option - -Use the `--config-dirs` command-line option, or the `config_dirs` key in the `nginx-agent.conf` file, to identify the directories NGINX Agent can read from or write to. This setting also defines the location to which you can upload config files when using a control/management plane. NGINX Agent cannot write to directories outside the specified location when updating a config and cannot upload files to directories outside of the configured location. -NGINX Agent follows NGINX configuration directives to file paths outside the designated directories and reads certificates' metadata. NGINX Agent uses the following directives: - -- [`ssl_certificate`](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate) - -#### NGINX Agent Dynamic Config Path Option - -Use the `--dynamic-config-path` command-line option to set the location of the dynamic config file. This setting also requires you to move your dynamic config to the new path, or create a new dynamic config file at the specified location. - -Default location in Linux environments: `/var/lib/nginx-agent/agent-dynamic.conf` - -Default location in FreeBSD environments: `/var/db/nginx-agent/agent-dynamic.conf` - -### NGINX Agent Environment Variables - -This section displays the configurable options for NGINX Agent that can be set with environment variables. A list of the configurable environment variables can be seen below: - -
- NGINX Agent Environment Variables - -```text -- NMS_INSTANCE_GROUP -- NMS_DISPLAY_NAME -- NMS_FEATURES -- NMS_LOG_LEVEL -- NMS_LOG_PATH -- NMS_PATH -- NMS_METRICS_COLLECTION_INTERVAL -- NMS_METRICS_MODE -- NMS_METRICS_BULK_SIZE -- NMS_METRICS_REPORT_INTERVAL -- NMS_NGINX_EXCLUDE_LOGS -- NMS_NGINX_SOCKET -- NMS_NGINX_TREAT_WARNINGS_AS_ERRORS -- NMS_SERVER_GRPCPORT -- NMS_SERVER_HOST -- NMS_SERVER_TOKEN -- NMS_SERVER_COMMAND -- NMS_SERVER_METRICS -- NMS_TAGS -- NMS_TLS_CA -- NMS_TLS_CERT -- NMS_TLS_ENABLE -- NMS_TLS_KEY -- NMS_TLS_SKIP_VERIFY -- NMS_CONFIG_DIRS -- NMS_QUEUE_SIZE -- NMS_DATAPLANE_REPORT_INTERVAL -- NMS_DATAPLANE_STATUS_POLL_INTERVAL -``` -
- -### NGINX Agent Log Rotation - -By default, NGINX Agent rotates logs daily using logrotate with the following configuration: - -
- NGINX Agent Logrotate Configuration - -``` yaml -/var/log/nginx-agent/*.log -{ - # log files are rotated every day - daily - # log files are rotated if they grow bigger than 5M - size 5M - # truncate the original log file after creating a copy - copytruncate - # remove rotated logs older than 10 days - maxage 10 - # log files are rotated 10 times before being removed - rotate 10 - # old log files are compressed - compress - # if the log file is missing it will go on to the next one without issuing an error message - missingok - # do not rotate the log if it is empty - notifempty -} -``` -
- -If you need to make changes to the default configuration you can update the file here `/etc/logrotate.d/nginx-agent` - -For more detail on logrotate configuration see [Logrotate Configuration Options](https://linux.die.net/man/8/logrotate) diff --git a/site/content/contribute/_index.md b/site/content/contribute/_index.md index dc79b629a7..9eebf54038 100644 --- a/site/content/contribute/_index.md +++ b/site/content/contribute/_index.md @@ -1,7 +1,6 @@ --- title: "Contribute" -description: "Learn about the NGINX Agent community and contribute to the project." -linkTitle: "Contribute" -menu: docs -weight: "500" ---- \ No newline at end of file +weight: 600 +--- + +Learn about the NGINX Agent community and how to contribute to the project. \ No newline at end of file diff --git a/site/content/contribute/community.md b/site/content/contribute/community.md index 4eea3d22a5..3fbf8f1615 100644 --- a/site/content/contribute/community.md +++ b/site/content/contribute/community.md @@ -1,13 +1,12 @@ --- title: "Community and contribution" -draft: false -weight: 100 toc: true -tags: [ "docs" ] -categories: ["configuration"] -doctypes: ["task"] +weight: 100 +docs: DOCS-000 --- +This topic describes the various ways you can get involved with the F5 NGINX Agent project. + # Community - Our [Slack channel #nginx-agent](https://nginxcommunity.slack.com/), is the go-to place to start asking questions and sharing your thoughts. diff --git a/site/content/contribute/dev-environment-setup.md b/site/content/contribute/dev-environment-setup.md index f756ef7fcd..d56c064cba 100644 --- a/site/content/contribute/dev-environment-setup.md +++ b/site/content/contribute/dev-environment-setup.md @@ -1,64 +1,61 @@ --- -title: "Development environment Setup" -draft: false -weight: 200 +title: "Development environment setup" toc: true -tags: [ "docs" ] -categories: ["development"] -doctypes: ["task"] +weight: 200 +docs: DOCS-000 --- ## Overview -Learn how to setup a Development Environment for NGINX Agent. +This page describes how to configure a development environment for F5 NGINX Agent. + +While most Linux or FreeBSD operating systems can be used to contribute to the NGINX Agent project, the following steps have been designed for Ubuntu. + +Ubuntu is the recommended operating system for development, as it comes with most packages requires to build and run NGINX Agent. + +## Before you begin -## Select an Operating System +To begin this task, you will require the following: -While most Linux or FreeBSD operating systems can be used to contribute to the NGINX Agent project, the following steps have been designed for Ubuntu. Ubuntu is packaged with most libraries required to build and run NGINX Agent, and is the recommended platform for NGINX Agent development. +- A [working NGINX Agent instance]({{< ref "/install-upgrade/install.md" >}}). +- A [Go installation](https://go.dev/dl/) of version 1.22.2 or newer. +- A [Protocol Buffer Compiler](https://grpc.io/docs/protoc-installation/) installation. -## Install NGINX +You will also need a copy of the NGINX Agent repository, which you can clone using `git`: -Follow the steps in the [Installation]({{< relref "/installation-upgrade/installation-github.md" >}}) section to download, install, and run NGINX and NGINX Agent. +```shell +git clone git@github.com:nginx/agent.git +``` -## Clone the NGINX Agent Repository +Read [Cloning a repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) for more information -Using your preferred method, clone the NGINX Agent repository into your development directory. See [Cloning a GitHub Repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) for additional help. +Follow the steps in the [Installation]({{< relref "/install-upgrade/install.md" >}}) topic to install NGINX Agent. -## Installing Prerequisite Packages +## Install prerequisite packages Depending on the operating system distribution, it may be necessary to install the following packages in order to build NGINX Agent. Change to the NGINX Agent source directory: -```bash +```shell cd /agent ``` Install Make: -```bash +```shell sudo apt install make ``` -NGINX Agent is written in Go. You may [download Go](https://go.dev/doc/install) and follow installation instructions on the same page or run: -```bash -sudo apt install golang-go -``` - -Install Protoc: -```bash -sudo apt install -y protobuf-compiler -``` - Install NGINX Agent tools and dependencies: Before starting development on NGINX Agent, it is important to download and install the necessary tool and dependencies required by NGINX Agent. You can do this by running the following `make` command: -```bash +```shell make install-tools deps ``` -## Building NGINX Agent from Source Code +## Build NGINX Agent from source code Run the following commands to build and run NGINX Agent: -```bash +```shell make build sudo make run ``` diff --git a/site/content/contribute/start-mock-interface.md b/site/content/contribute/start-mock-interface.md new file mode 100644 index 0000000000..2c148de78e --- /dev/null +++ b/site/content/contribute/start-mock-interface.md @@ -0,0 +1,90 @@ +--- +title: Start mock control plane interface +toc: true +weight: 300 +docs: DOCS-000 +--- + +This document describes how to configure and run F5 NGINX Agent using a mock interface ("control plane") for NGINX Agent to report to. + +The mock interface is useful when developing NGINX Agent, as it allows you to view what metrics are being reported. + +## Before you begin + +To begin this task, you will require the following: + +- A [working NGINX Agent instance]({{< ref "/install-upgrade/install.md" >}}). +- A [Go installation](https://go.dev/dl/) of version 1.22.2 or newer. +- A [go-swagger](https://goswagger.io/go-swagger/install/) installation. + +You will also need a copy of the NGINX Agent repository, which you can clone using `git`: + +```shell +git clone git@github.com:nginx/agent.git +``` + +Read [Cloning a repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) for more information. + +## Start the gRPC mock control plane + +Start the mock control plane by running the following command from the `agent` source code root directory: + +```shell +go run sdk/examples/server.go +``` +```text +INFO[0000] http listening at 54790 # mock control plane port +INFO[0000] grpc listening at 54789 # grpc control plane port which NGINX Agent will report to +``` + +The mock control plane can use either gRPC or REST protocols to communicate with NGINX Agent. + +To enable them, view the [Enable gRPC and REST interfaces]({{< relref "/how-to/enable-interfaces.md" >}}) topic. + +## Launch Swagger UI + +To launch the Swagger UI for the REST interface run the following command: + +```shell +make launch-swagger-ui +``` + +## Start NGINX Agent + +Open another terminal window and start NGINX Agent. Issue the following command from the `agent` source code root directory. + +```shell +sudo make run +``` +```text +WARN[0000] Log level is info +INFO[0000] setting displayName to XXX +INFO[0000] NGINX Agent at with pid 12345, clientID=XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX name=XXX +INFO[0000] NginxBinary initializing +INFO[0000] Commander initializing +INFO[0000] Comms initializing +INFO[0000] OneTimeRegistration initializing +INFO[0000] Registering XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX +INFO[0000] Metrics initializing +INFO[0000] MetricsThrottle initializing +INFO[0000] DataPlaneStatus initializing +INFO[0000] MetricsThrottle waiting for report ready +INFO[0000] Metrics waiting for handshake to be completed +INFO[0000] ProcessWatcher initializing +INFO[0000] Extensions initializing +INFO[0000] FileWatcher initializing +INFO[0000] FileWatchThrottle initializing +INFO[0001] Events initializing +INFO[0001] OneTimeRegistration completed +``` + +Open a web browser to view the mock control plane at [http://localhost:54790](http://localhost:54790). The following links will be shown in the web interface: + +- **registered** - shows registration information of the data plane +- **nginxes** - lists the nginx instances on the data plane +- **configs** - shows the protobuf payload for NGINX configuration sent to the management plane +- **configs/chunked** - shows the split-up payloads sent to the management plane +- **configs/raw** - shows the actual configuration as it would live on the data plane +- **metrics** - shows a buffer of metrics sent to the management plane (similar to what will be sent back in the REST API) + +For more NGINX Agent use cases, refer to the [NGINX Agent SDK examples](https://github.com/nginx/agent/tree/main/sdk/examples). \ No newline at end of file diff --git a/site/content/how-to/_index.md b/site/content/how-to/_index.md new file mode 100644 index 0000000000..3f01dc82b9 --- /dev/null +++ b/site/content/how-to/_index.md @@ -0,0 +1,6 @@ +--- +title: "How-to guides" +weight: 500 +--- + +Learn how to configure NGINX Agent \ No newline at end of file diff --git a/site/content/how-to/configuration-overview.md b/site/content/how-to/configuration-overview.md new file mode 100644 index 0000000000..26c2a41b27 --- /dev/null +++ b/site/content/how-to/configuration-overview.md @@ -0,0 +1,290 @@ +--- +title: "Configuration overview" +toc: true +weight: 100 +docs: DOCS-1229 +--- + +This page describes how to configure F5 NGINX Agent using configuration files, CLI (Command line interface) flags, and environment variables. + +{{}} + +- NGINX Agent interprets configuration values set by configuration files, CLI flags, and environment variables in the following priorities: + + 1. CLI flags overwrite configuration files and environment variable values. + 2. Environment variables overwrite configuration file values. + 3. Config files are the lowest priority and config settings are superseded if either of the other options is used. + +- You must open any required firewall ports or add SELinux/AppArmor rules for the ports and IPs you want to use. + +{{}} + +## Configuration files + +The default locations of configuration files for NGINX Agent are `/etc/nginx-agent/nginx-agent.conf` and `/var/lib/nginx-agent/agent-dynamic.conf`. The `agent-dynamic.conf` file default location is different for FreeBSD which is located `/var/db/nginx-agent/agent-dynamic.conf`. These files have comments at the top indicating their purpose. + +Examples of the configuration files are provided below: + +
+ example nginx-agent.conf + +{{}} +In the following example `nginx-agent.conf` file, you can change the `server.host` and `server.grpcPort` to connect to the control plane. +{{}} + +```nginx {hl_lines=[13]} +# +# /etc/nginx-agent/nginx-agent.conf +# +# Configuration file for NGINX Agent. +# +# This file tracks agent configuration values that are meant to be statically set. There +# are additional NGINX Agent configuration values that are set via the API and agent install script +# which can be found in /etc/nginx-agent/agent-dynamic.conf. + +# specify the server grpc port to connect to +server: + # host of the control plane + host: + grpcPort: 443 + backoff: # note: default values are prepopulated + initial_interval: 100ms # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour + randomization_factor: 0.10 # Add the appropriate float value here, e.g., 0.10 + multiplier: 1.5 # Add the appropriate float value here, e.g., 1.5 + max_interval: 1m # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour + max_elapsed_time: 0 # Add the appropriate duration value here, e.g., "0" for indefinite "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour +# tls options +tls: + # enable tls in the nginx-agent setup for grpcs + # default to enable to connect with secure connection but without client cert for mtls + enable: true + # controls whether the server certificate chain and host name are verified. + # for production use, see instructions for configuring TLS + skip_verify: false +log: + # set log level (panic, fatal, error, info, debug, trace; default "info") + level: info + # set log path. if empty, don't log to file. + path: /var/log/nginx-agent/ +nginx: + # path of NGINX logs to exclude + exclude_logs: "" + # Set to true when NGINX configuration should contain no warnings when performing a configuration apply (nginx -t is used to carry out this check) + treat_warnings_as_errors: false # Default is false +# data plane status message / 'heartbeat' +dataplane: + status: + # poll interval for dataplane status - the frequency the NGINX Agent will query the dataplane for changes + poll_interval: 30s + # report interval for dataplane status - the maximum duration to wait before syncing dataplane information if no updates have been observed + report_interval: 24h +metrics: + # specify the size of a buffer to build before sending metrics + bulk_size: 20 + # specify metrics poll interval + report_interval: 1m + collection_interval: 15s + mode: aggregated + backoff: # note: default values are prepopulated + initial_interval: 100ms # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour + randomization_factor: 0.10 # Add the appropriate float value here, e.g., 0.10 + multiplier: 1.5 # Add the appropriate float value here, e.g., 1.5 + max_interval: 1m # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour + max_elapsed_time: 0 # Add the appropriate duration value here, e.g., "0" for indefinite "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour + +# OSS NGINX default config path +# path to aux file dirs can also be added +config_dirs: "/etc/nginx:/usr/local/etc/nginx" + +# Internal queue size +queue_size: 100 + +extensions: + - nginx-app-protect + +# Enable reporting NGINX App Protect details to the control plane. +nginx_app_protect: + # Report interval for NGINX App Protect details - the frequency NGINX Agent checks NGINX App Protect for changes. + report_interval: 15s + # Enable precompiled publication from the NGINX Management Suite (true) or perform compilation on the data plane host (false). + precompiled_publication: true +``` + +
+ + +
+ example dynamic-agent.conf + +{{}} +Default location in Linux environments: `/var/lib/nginx-agent/agent-dynamic.conf` + +Default location in FreeBSD environments: `/var/db/nginx-agent/agent-dynamic.conf` +{{}} + +```yaml +# Dynamic configuration file for NGINX Agent. +# +# The purpose of this file is to track agent configuration +# values that can be dynamically changed via the API and the agent install script. +# You may edit this file, but API calls that modify the tags on this system will +# overwrite the tag values in this file. +# +# The agent configuration values that API calls can modify are as follows: +# tags: +# - dev +# - qa +# +# The agent configuration value that the agent install script can modify are as follows: +# instance_group: my-instance-group + +instance_group: my-instance-group +tags: + - dev + - qa +``` + +
+ +## CLI flags and environment variables + +This section details the CLI flags and corresponding environment variables used to configure the NGINX Agent. + +### CLI flags + +```sh +nginx-agent [flags] +``` + +### Environment variables + +```sh +export ENV_VARIABLE_NAME="value" +nginx-agent +``` + +### Flag and environment arguments + +{{< warning >}} + +Before version 2.35.0, the environment variables were prefixed with `NMS_` instead of `NGINX_AGENT_`. + +If you are upgrading from an older version, update your configuration accordingly. + +{{< /warning >}} + +{{}} +| CLI flag | Environment variable | Description | +|---------------------------------------------|--------------------------------------|-----------------------------------------------------------------------------| +| `--api-cert` | `NGINX_AGENT_API_CERT` | Specifies the certificate used by the Agent API. | +| `--api-host` | `NGINX_AGENT_API_HOST` | Sets the host used by the Agent API. Default: *127.0.0.1* | +| `--api-key` | `NGINX_AGENT_API_KEY` | Specifies the key used by the Agent API. | +| `--api-port` | `NGINX_AGENT_API_PORT` | Sets the port for exposing nginx-agent to HTTP traffic. | +| `--config-dirs` | `NGINX_AGENT_CONFIG_DIRS` | Defines directories NGINX Agent can read/write. Default: *"/etc/nginx:/usr/local/etc/nginx:/usr/share/nginx/modules:/etc/nms"* | +| `--dataplane-report-interval` | `NGINX_AGENT_DATAPLANE_REPORT_INTERVAL` | Sets the interval for dataplane reporting. Default: *24h0m0s* | +| `--dataplane-status-poll-interval` | `NGINX_AGENT_DATAPLANE_STATUS_POLL_INTERVAL` | Sets the interval for polling dataplane status. Default: *30s* | +| `--display-name` | `NGINX_AGENT_DISPLAY_NAME` | Sets the instance's display name. | +| `--dynamic-config-path` | `NGINX_AGENT_DYNAMIC_CONFIG_PATH` | Specifies the path of the Agent dynamic config file. Default: *"/var/lib/nginx-agent/agent-dynamic.conf"* | +| `--features` | `NGINX_AGENT_FEATURES` | Specifies a comma-separated list of features enabled for the agent. Default: *[registration, nginx-config-async, nginx-ssl-config, nginx-counting, metrics, dataplane-status, process-watcher, file-watcher, activity-events, agent-api]* | +| `--ignore-directives` | | Specifies a comma-separated list of directives to ignore for sensitive info.| +| `--instance-group` | `NGINX_AGENT_INSTANCE_GROUP` | Sets the instance's group value. | +| `--log-level` | `NGINX_AGENT_LOG_LEVEL` | Sets the logging level (e.g., panic, fatal, error, info, debug, trace). Default: *info* | +| `--log-path` | `NGINX_AGENT_LOG_PATH` | Specifies the path to output log messages. | +| `--metrics-bulk-size` | `NGINX_AGENT_METRICS_BULK_SIZE` | Specifies the number of metrics reports collected before sending data. Default: *20* | +| `--metrics-collection-interval` | `NGINX_AGENT_METRICS_COLLECTION_INTERVAL` | Sets the interval for metrics collection. Default: *15s* | +| `--metrics-mode` | `NGINX_AGENT_METRICS_MODE` | Sets the metrics collection mode: streaming or aggregation. Default: *aggregated* | +| `--metrics-report-interval` | `NGINX_AGENT_METRICS_REPORT_INTERVAL` | Sets the interval for reporting collected metrics. Default: *1m0s* | +| `--nginx-config-reload-monitoring-period` | | Sets the duration to monitor error logs after an NGINX reload. Default: *10s* | +| `--nginx-exclude-logs` | `NGINX_AGENT_NGINX_EXCLUDE_LOGS` | Specifies paths of NGINX access logs to exclude from metrics collection. | +| `--nginx-socket` | `NGINX_AGENT_NGINX_SOCKET` | Specifies the location of the NGINX Plus counting Unix socket. Default: *unix:/var/run/nginx-agent/nginx.sock* | +| `--nginx-treat-warnings-as-errors` | `NGINX_AGENT_NGINX_TREAT_WARNINGS_AS_ERRORS` | Treats warnings as failures on configuration application. | +| `--queue-size` | `NGINX_AGENT_QUEUE_SIZE` | Specifies the size of the NGINX Agent internal queue. | +| `--server-command` | | Specifies the name of the command server sent in the TLS configuration. | +| `--server-grpcport` | `NGINX_AGENT_SERVER_GRPCPORT` | Sets the desired GRPC port for NGINX Agent traffic. | +| `--server-host` | `NGINX_AGENT_SERVER_HOST` | Specifies the IP address of the server host. | +| `--server-metrics` | | Specifies the name of the metrics server sent in the TLS configuration. | +| `--server-token` | `NGINX_AGENT_SERVER_TOKEN` | Sets the authentication token for accessing the commander and metrics services. Default: *e202f883-54c6-4702-be15-3ba6e507879a* | +| `--tags` | `NGINX_AGENT_TAGS` | Specifies a comma-separated list of tags for the instance or machine. | +| `--tls-ca` | `NGINX_AGENT_TLS_CA` | Specifies the path to the CA certificate file for TLS. | +| `--tls-cert` | `NGINX_AGENT_TLS_CERT` | Specifies the path to the certificate file for TLS. | +| `--tls-enable` | `NGINX_AGENT_TLS_ENABLE` | Enables TLS for secure communications. | +| `--tls-key` | `NGINX_AGENT_TLS_KEY` | Specifies the path to the certificate key file for TLS. | +| `--tls-skip-verify` | `NGINX_AGENT_TLS_SKIP_VERIFY` | Insecurely skips verification for gRPC TLS credentials. | +{{}} + +
+ +{{}} +Use the `--config-dirs` command-line option, or the `config_dirs` key in the `nginx-agent.conf` file, to identify the directories NGINX Agent can read from or write to. This setting also defines the location to which you can upload config files when using a control plane. + +NGINX Agent cannot write to directories outside the specified location when updating a config and cannot upload files to directories outside of the configured location. + +NGINX Agent follows NGINX configuration directives to file paths outside the designated directories and reads certificates' metadata. NGINX Agent uses the following directives: + +- [`ssl_certificate`](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate) + +{{}} + +{{}} Use the `--dynamic-config-path` command-line option to set the location of the dynamic config file. This setting also requires you to move your dynamic config to the new path, or create a new dynamic config file at the specified location. + +Default location in Linux environments: `/var/lib/nginx-agent/agent-dynamic.conf` + +Default location in FreeBSD environments: `/var/db/nginx-agent/agent-dynamic.conf` + +{{}} + +## Logs + +NGINX Agent uses formatted log files to collect metrics. Expanding log formats and instance counts will also increase the size of the NGINX Agent log files. + +We recommend adding a separate partition for `/var/log/nginx-agent`. + +{{< important >}} +Without log rotation or storage on a separate partition, log files could use up all the free drive space and cause your system to become unresponsive to certain services. +{{< /important >}} + +By default, NGINX Agent rotates logs daily using logrotate with the following configuration: + +
+ NGINX Agent Logrotate Configuration + +``` yaml +/var/log/nginx-agent/*.log +{ + # log files are rotated every day + daily + # log files are rotated if they grow bigger than 5M + size 5M + # truncate the original log file after creating a copy + copytruncate + # remove rotated logs older than 10 days + maxage 10 + # log files are rotated 10 times before being removed + rotate 10 + # old log files are compressed + compress + # if the log file is missing it will go on to the next one without issuing an error message + missingok + # do not rotate the log if it is empty + notifempty +} +``` +
+ +If you need to change the default configuration, update the file at `/etc/logrotate.d/nginx-agent`. + +For more details on logrotate configuration, see [Logrotate Configuration Options](https://linux.die.net/man/8/logrotate). + + +## Extensions + +An extension is noncritical code to the main functionality of NGINX Agent. They generally cover functionality outside of managing NGINX configuration and reporting metrics. + +To enable an extension, it must be added to the extensions list in the `/etc/nginx-agent/nginx-agent.conf`. + +This example enables the advanced metrics extension: + +```yaml +extensions: + - advanced-metrics +``` \ No newline at end of file diff --git a/site/content/configuration/configure-nginx-agent-group.md b/site/content/how-to/configure-agent-group.md similarity index 84% rename from site/content/configuration/configure-nginx-agent-group.md rename to site/content/how-to/configure-agent-group.md index 9aa87c9a0a..dbfd3c6dd7 100644 --- a/site/content/configuration/configure-nginx-agent-group.md +++ b/site/content/how-to/configure-agent-group.md @@ -1,13 +1,12 @@ --- -title: "Add NGINX Users to nginx-agent group" -draft: false -weight: 300 +title: "Add users to nginx-agent group" toc: true -tags: [ "docs" ] -categories: ["configuration"] -doctypes: ["task"] +weight: 400 +docs: DOCS-000 --- +This page describes how the F5 NGINX Agent process interacts with the NGINX user on a system, and how to add users to the NGINX Agent group. + ## Overview During installation, NGINX Agent detects the NGINX user (typically `nginx`) for the master and worker processes and adds this user to a group called `nginx-agent`. @@ -16,8 +15,9 @@ If you change the NGINX username after installing the NGINX Agent, you'll need t A failure to update the `nginx-agent` group when the NGINX username changes may result in non-compliance errors for NGINX Plus. +--- -## NGINX Socket +## NGINX socket NGINX Agent creates a socket in the default location `/var/run/nginx-agent/nginx.sock`. You can customize this location by editing the `nginx-agent.conf` file and setting the path similar to the following example: @@ -29,57 +29,58 @@ nginx: The socket server starts when the NGINX socket configuration is enabled; the socket configuration is enabled by default. +--- -## Add NGINX Users to nginx-agent Group +## Add NGINX Users to nginx-agent group To manually add NGINX users to the `nginx-agent` group, take the following steps: 1. Verify the `nginx-agent` group exists: - ```bash + ```shell sudo getent group | grep nginx-agent ``` The output looks similar to the following example: - ```bash + ```shell nginx-agent:x:1001:root,nginx ``` If the group doesn't exist, create it by running the following command: - ```bash + ```shell sudo groupadd nginx-agent ``` 2. Verify the ownership of `/var/run/nginx-agent` directory: - ```bash + ```shell ls -l /var/run/nginx-agent ``` The output looks similar to the following: - ```bash + ```shell total 0 srwxrwxr-x 1 root nginx-agent 0 Jun 13 10:51 nginx.sockvv ``` If the group ownership is not `nginx-agent`, change the ownership by running the following command: - ```bash + ```shell sudo chown :nginx-agent /var/run/nginx-agent ``` 3. To add NGINX user(s) to the `nginx-agent` group, run the following command: - ```bash + ```shell sudo usermod -a -G nginx-agent ``` For example to add the `nginx` user, take the following step: - ```bash + ```shell sudo usermod -a -G nginx-agent nginx ``` diff --git a/site/content/configuration/connect-management-plane.md b/site/content/how-to/connect-management-plane.md similarity index 91% rename from site/content/configuration/connect-management-plane.md rename to site/content/how-to/connect-management-plane.md index c11c39c9a6..c0919d65eb 100644 --- a/site/content/configuration/connect-management-plane.md +++ b/site/content/how-to/connect-management-plane.md @@ -1,15 +1,13 @@ --- title: "Connect to management plane" -weight: 400 toc: true -tags: [ "docs" ] -categories: ["configuration"] -doctypes: ["task"] +weight: 600 +docs: DOCS-000 --- ## Overview -To monitor and manage all your NGINX Agent instances from a central management plane server, you first need to connect your instances and the server. You can configure the connection by making the required changes to the NGINX Agent configuration file. +To monitor and manage all your F5 NGINX Agent instances from a central management plane server, you first need to connect your instances and the server. You can configure the connection by making the required changes to the NGINX Agent configuration file. There are three types of connections you can establish between the NGINX Agent and the management plane server: @@ -52,7 +50,7 @@ To establish a mTLS connection between the NGINX Agent and the management plane ``` 2. Restart the NGINX Agent service: - ```bash + ```shell sudo systemctl restart nginx-agent ``` @@ -86,7 +84,7 @@ To establish a TLS connection between the NGINX Agent and the management plane s 2. Restart the NGINX Agent service: - ```bash + ```shell sudo systemctl restart nginx-agent ``` @@ -111,6 +109,6 @@ To establish an insecure connection between the NGINX Agent and the management p 2. Restart the NGINX Agent service: - ```bash + ```shell sudo systemctl restart nginx-agent ``` diff --git a/site/content/how-to/enable-interfaces.md b/site/content/how-to/enable-interfaces.md new file mode 100644 index 0000000000..c73557165a --- /dev/null +++ b/site/content/how-to/enable-interfaces.md @@ -0,0 +1,73 @@ +--- +title: "Enable gRPC and REST interfaces" +toc: true +weight: 200 +docs: DOCS-000 +--- + +This document describes how to enable the gRPC and REST interfaces for F5 NGINX Agent. + +## Before you begin + +If it doesn't already exist, create the directory `/etc/nginx-agent/`and copy the `nginx-agent.conf` file into it from the project root directory. + +```shell +sudo mkdir /etc/nginx-agent +sudo cp /nginx-agent.conf /etc/nginx-agent/ +``` + +Create the `agent-dynamic.conf` file, which is required for NGINX Agent to run. + +In Linux environments: +```shell +sudo touch /var/lib/nginx-agent/agent-dynamic.conf +``` + +In FreeBSD environments: +```shell +sudo touch /var/db/nginx-agent/agent-dynamic.conf +``` + +--- + +## Enable the gRPC interface + +Add the the following settings to `/etc/nginx-agent/nginx-agent.conf`: + +```yaml +server: + host: 127.0.0.1 # mock control plane host + grpcPort: 54789 # mock control plane gRPC port + +# gRPC TLS options - DISABLING TLS IS NOT RECOMMENDED FOR PRODUCTION +tls: + enable: false + skip_verify: true +``` + +For more information, see [Agent Protocol Definitions and Documentation](https://github.com/nginx/agent/tree/main/docs/proto/README.md). + +--- + +## Enable the REST interface + +The NGINX Agent REST interface can be exposed by validating the following lines in the `/etc/nginx-agent/nginx-agent.conf` file are present: + +```yaml +api: + # Set API address to allow remote management + host: 127.0.0.1 + # Set this value to a secure port number to prevent information leaks + port: 8038 + # REST TLS parameters + cert: ".crt" + key: ".key" +``` + +--- + +## Start NGINX Agent + +To apply the new configuration, NGINX Agent must be started or restarted. + +You may want to view the [Start mock control plane interface]({{< relref "/contribute/start-mock-interface.md" >}}) topic to test NGINX Agent, or view the [Configuration overview]({{< relref "/how-to/configuration-overview.md" >}}) for more options. \ No newline at end of file diff --git a/site/content/configuration/encrypt-communication.md b/site/content/how-to/encrypt-communication.md similarity index 95% rename from site/content/configuration/encrypt-communication.md rename to site/content/how-to/encrypt-communication.md index 3ff8b8e3cc..00876ffc40 100644 --- a/site/content/configuration/encrypt-communication.md +++ b/site/content/how-to/encrypt-communication.md @@ -1,14 +1,13 @@ --- -title: Encrypt communication -tags: -- docs +title: "Encrypt communication" toc: true -weight: 200 +weight: 500 +docs: DOCS-000 --- ## Overview -Follow the steps in this guide to encrypt communication between NGINX Agent and Instance Manager with TLS. +Follow the steps in this guide to encrypt communication between F5 NGINX Agent and Instance Manager with TLS. ## Before You Begin @@ -40,7 +39,7 @@ The `cert-sni-name` value should match the SubjectAltName of the server certific To enable mTLS for the NGINX Agent from the command line, run the following command: -```bash +```shell nginx-agent --tls-cert "path-to-cert" --tls-key "path-to-key" --tls-ca "path-to-ca-cert" --tls-enable ``` @@ -48,7 +47,7 @@ nginx-agent --tls-cert "path-to-cert" --tls-key "path-to-key" --tls-ca "path-to- To enable mTLS for NGINX Agent using environment variables, run the following commands: -```bash +```shell NMS_TLS_CA="my-env-ca" NMS_TLS_KEY="my-env-key" NMS_TLS_CERT="my-env-cert" @@ -67,7 +66,7 @@ To enable server-side TLS you must have TLS enabled. See the following examples You can edit the `/etc/nginx-agent/nginx-agent.conf` file to enable server-side TLS. Make the following changes: -```bash +```shell tls: enable: true skip_verify: false @@ -77,7 +76,7 @@ tls: To enable server-side TLS from the command line, run the following command: -```bash +```shell nginx-agent --tls-enable ``` @@ -85,7 +84,7 @@ nginx-agent --tls-enable To enable server-side TLS using environment variables, run the following commands: -```bash +```shell NMS_TLS_ENABLE=true ``` @@ -99,7 +98,7 @@ NMS_TLS_ENABLE=true To enable server-side TLS with a self-signed certificate, you must have TLS enabled and set `skip_verify` to `true`, which disables hostname validation. Setting `skip_verify` can be done done only by updating the configuration file. See the following example: -```bash +```shell tls: enable: true skip_verify: true @@ -113,7 +112,7 @@ To enable insecure mode, you simply need to set `tls:enable` to `false`. Setting You can edit the `/etc/nginx-agent/nginx-agent.conf` file to enable insecure mode. Make the following changes: -```bash +```shell tls: enable: false ``` @@ -122,6 +121,6 @@ tls: To enable insecure mode using environment variables, run the following commands: -```bash +```shell NMS_TLS_ENABLE=false ``` diff --git a/site/content/how-to/export-metrics.md b/site/content/how-to/export-metrics.md new file mode 100644 index 0000000000..7bbd3a6871 --- /dev/null +++ b/site/content/how-to/export-metrics.md @@ -0,0 +1,45 @@ +--- +title: "Export metrics data" +weight: 300 +docs: DOCS-000 +--- + +This document describes how to export the metrics data from F5 NGINX Agent. + +[//]: # "These are Markdown comments to guide you through document structure." +[//]: # "Remove them as you go, as well as unnecessary sections for this use case." + +## Overview + +[//]: # "Write a description which outlines precisely what this page of instructions will accomplish." +[//]: # "This description, like all instructions, should be direct and imperative." +[//]: # "Avoid ambiguous promises such as 'enables functionality': state precisely what it does." + +--- + +## Before you begin + +[//]: # "List all of the prerequisites for completing this task." +[//]: # "This might be the first page for a reader, so include a link to installation." + +To begin this task, you will require the following: + +- A [working NGINX Agent instance]({{< ref "/install-upgrade/install.md" >}}). +- +- + +--- + +## Export metrics data + + + +--- + +## See also + +[//]: # "Examples of additional topics users might want to read include:" +[//]: # "Relevant reference information, configuration options and more complex use cases." + +- [OpenTelemetry metrics]({{< ref "/metrics.md" >}}) +- diff --git a/site/content/install-upgrade/_index.md b/site/content/install-upgrade/_index.md new file mode 100644 index 0000000000..db1eae8abf --- /dev/null +++ b/site/content/install-upgrade/_index.md @@ -0,0 +1,6 @@ +--- +title: "Install and upgrade" +weight: 400 +--- + +Learn how to install, upgrade, and uninstall NGINX Agent. \ No newline at end of file diff --git a/site/content/install-upgrade/container-environments/_index.md b/site/content/install-upgrade/container-environments/_index.md new file mode 100644 index 0000000000..bd7ec74ba0 --- /dev/null +++ b/site/content/install-upgrade/container-environments/_index.md @@ -0,0 +1,6 @@ +--- +title: "Container environments" +weight: 400 +--- + +Learn how to build and run NGINX Agent docker images. \ No newline at end of file diff --git a/site/content/installation-upgrade/container-environments/docker-images.md b/site/content/install-upgrade/container-environments/docker-images.md similarity index 90% rename from site/content/installation-upgrade/container-environments/docker-images.md rename to site/content/install-upgrade/container-environments/docker-images.md index 22f76645c3..28db5a6bd9 100644 --- a/site/content/installation-upgrade/container-environments/docker-images.md +++ b/site/content/install-upgrade/container-environments/docker-images.md @@ -1,22 +1,18 @@ --- title: "Build container images" -draft: false -weight: 100 toc: true -tags: [ "docs" ] -categories: ["configuration"] -doctypes: ["task"] +weight: 100 +docs: DOCS-000 --- ## Overview -NGINX Agent is a companion daemon for NGINX Open Source or NGINX Plus instances and must run in the same container to work. The NGINX Agent GitHub repository includes [Dockerfiles](https://github.com/nginx/agent/tree/main/scripts/docker) that you can use to build custom container images that bundle NGINX Agent with NGINX or NGINX Plus. +F5 NGINX Agent is a companion daemon for NGINX Open Source or NGINX Plus instances and must run in the same container to work. The NGINX Agent GitHub repository includes [Dockerfiles](https://github.com/nginx/agent/tree/main/scripts/docker) that you can use to build custom container images that bundle NGINX Agent with NGINX or NGINX Plus. If you want to use NGINX Agent with NGINX Plus, you need to purchase an NGINX Plus license. Contact your F5 Sales representative for assistance. See the requirements and supported operating systems in the [NGINX Agent Technical Specifications]({{< relref "technical-specifications.md" >}}) topic. - ## Set up your environment ### Install a container engine @@ -158,47 +154,36 @@ $ docker build -t nginx-agent . \ Here is an example of how to run the NGINX Agent container using Docker: -```console +```shell docker run --name nginx-agent -d nginx-agent ``` -{{}}To learn more about the configuration options, refer to the NGINX Agent [Configuration Overview]({{< relref "/configuration/configuration-overview" >}}).{{}} +{{< note >}} To learn more about the configuration options, refer to the [Configuration overview]({{< relref "/how-to/configuration-overview" >}}) topic. {{}} + +--- ### Enable the gRPC interface -To connect your NGINX Agent container to your NGINX One or NGINX Instance Manager instance, you must enable the gRPC interface. To do this, you must edit the NGINX Agent configuration file, *nginx-agent.conf*. For example: +To connect your NGINX Agent container to your NGINX One or NGINX Instance Manager instance, you must enable the gRPC interface. -```yaml -erver: - host: 127.0.0.1 # mock control plane host - grpcPort: 54789 # mock control plane gRPC port +The configuration required is explained in the [Enable the gRPC interface]({{< relref "/how-to/enable-interfaces.md#enable-the-grpc-interface" >}}) -# gRPC TLS options - DISABLING TLS IS NOT RECOMMENDED FOR PRODUCTION -tls: - enable: false - skip_verify: true -``` +--- ### Enable the REST interface -If your control plane requires REST API, you can expose NGINX Agent's REST API by editing the NGINX Agent configuration file, *nginx-agent.conf*. For example: - -```yaml -api: - host: 0.0.0.0 - port: 8038 -``` +If your control plane requires a REST API, you can [Enable the REST interface]({{< relref "/how-to/enable-interfaces.md#enable-the-rest-interfacee" >}}) for NGINX Agent. Once you have updated the *nginx-agent.conf* file, you can run the container with the updated **nginx-agent.conf** mounted and the port **8038** exposed with the following command: -```console +```shell docker run --name nginx-agent -d \ --mount type=bind,source="$(pwd)"/nginx-agent.conf,target=/etc/nginx-agent/nginx-agent.conf,readonly \ -p 127.0.0.1:8038:8038/tcp \ nginx-agent ``` -
+--- ## Build the NGINX Agent images for specific OS targets diff --git a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/container-environments/docker-support.md b/site/content/install-upgrade/container-environments/docker-support.md similarity index 80% rename from site/content/previous-versions/NGINX-agent-v2/installation-upgrade/container-environments/docker-support.md rename to site/content/install-upgrade/container-environments/docker-support.md index 7123d9ee12..f6e41ad6fd 100644 --- a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/container-environments/docker-support.md +++ b/site/content/install-upgrade/container-environments/docker-support.md @@ -1,18 +1,13 @@ --- -title: Container Support and Troubleshooting -categories: -- installation -draft: false -tags: -- docs +title: "Container support and troubleshooting" toc: true weight: 200 -docs: "DOCS-909" +docs: DOCS-000 --- ## Overview -The NGINX Agent repository includes [Dockerfiles](https://github.com/nginx/agent/tree/main/scripts/docker) that can be used to [build custom container images]({{< relref "installation-upgrade/container-environments/docker-images.md" >}}). Images are created with an NGINX Open Source or NGINX Plus instance and are available for various operating systems. +The F5 NGINX Agent repository includes [Dockerfiles](https://github.com/nginx/agent/tree/main/scripts/docker) that can be used to [build custom container images]({{< relref "/install-upgrade/container-environments/docker-images.md" >}}). Images are created with an NGINX Open Source or NGINX Plus instance and are available for various operating systems. See the [Technical Specifications]({{< relref "/technical-specifications.md#container-support" >}}) for a list of supported operationg systems. @@ -24,8 +19,8 @@ To collect metrics about the Docker container that the NGINX Agent is running in NGINX Agent supports both versions of cgroups. -- https://www.kernel.org/doc/Documentation/cgroup-v1/ -- https://www.kernel.org/doc/Documentation/cgroup-v2.txt +- https://www.kernel.org/doc/Documentation/cgroup-v1/ +- https://www.kernel.org/doc/Documentation/cgroup-v2.txt ## Metrics @@ -59,7 +54,7 @@ If no memory limit is set when starting the Docker container, then the memory li If a warning message similar to the following example is seen in the NGINX Agent logs, the swap memory limit for the Docker container is greater than the swap memory for the Docker host system: -```bash +```shell Swap memory limit specified for the container, ... is greater than the host system swap memory ... ``` @@ -67,7 +62,7 @@ The `system.swap.total` metric for the container matches the total swap memory f If a warning message similar to the following example is seen in the NGINX Agent logs, the Docker host system does not have cgroup swap limit capabilities enabled. To enable these capabilities, follow the steps below. -```bash +```shell Unable to collect Swap metrics because the file ... was not found ``` @@ -75,7 +70,7 @@ Unable to collect Swap metrics because the file ... was not found Run the following command to see if the cgroup swap limit capabilities are enabled: -```bash +```shell $ docker info | grep swap WARNING: No swap limit support ``` diff --git a/site/content/install-upgrade/install.md b/site/content/install-upgrade/install.md new file mode 100644 index 0000000000..95f6514684 --- /dev/null +++ b/site/content/install-upgrade/install.md @@ -0,0 +1,784 @@ +--- +title: Install NGINX Agent +toc: true +weight: 100 +docs: DOCS-000 +--- + +This document describes the three main ways to install F5 NGINX agent: + +- Using the NGINX Open Source repository +- Using the NGINX Plus repository +- Using the GitHub package files + +## Before you begin + +There are a few prerequisites shared between all installation methods: + +- A [supported operating system and architecture](../technical-specifications/#supported-distributions) +- `root` privilege + +## NGINX Open Source repository + +Before you install NGINX Agent, you must install and run NGINX. + +If you don't have it installed already, read the [Installing NGINX Open Source +](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/) topic. + + +### Configure NGINX OSS Repository for installing NGINX Agent + +Before you install NGINX Agent for the first time on your system, you need to set up the `nginx-agent` packages repository. Afterward, you can install and update NGINX Agent from the repository. + +- [Install NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux](#install-nginx-agent-on-rhel-centos-rocky-linux-almalinux-and-oracle-linux) +- [Install NGINX Agent on Ubuntu](#install-nginx-agent-on-ubuntu) +- [Install NGINX Agent on Debian](#install-nginx-agent-on-debian) +- [Install NGINX Agent on SLES](#install-nginx-agent-on-sles) +- [Install NGINX Agent on Alpine Linux](#install-nginx-agent-on-alpine-linux) +- [Install NGINX Agent on Amazon Linux](#install-nginx-agent-on-amazon-linux) +- [Install NGINX Agent on FreeBSD](#install-nginx-agent-on-freebsd) + +#### Install NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux + +1. Install the prerequisites: + + ```shell + sudo yum install yum-utils + ``` + +1. To set up the yum repository, create the file named `/etc/yum.repos.d/nginx-agent.repo` with the following contents: + + ``` + [nginx-agent] + name=nginx agent repo + baseurl=http://packages.nginx.org/nginx-agent/centos/$releasever/$basearch/ + gpgcheck=1 + enabled=1 + gpgkey=https://nginx.org/keys/nginx_signing.key + module_hotfixes=true + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo yum install nginx-agent + ``` + + When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. + +#### Install NGINX Agent on Ubuntu + +1. Install the prerequisites: + + ```shell + sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring + ``` + +1. Import an official nginx signing key so apt could verify the packages authenticity. Fetch the key: + + ```shell + curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ + | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null + ``` + +1. Verify that the downloaded file contains the proper key: + + ```shell + gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg + ``` + + The output should contain the full fingerprint `573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62` as follows: + + ``` + pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] + 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 + uid nginx signing key + ``` + + {{< important >}}If the fingerprint is different, remove the file.{{< /important >}} + +1. Add the nginx agent repository: + + ```shell + echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \ + http://packages.nginx.org/nginx-agent/ubuntu/ `lsb_release -cs` agent" \ + | sudo tee /etc/apt/sources.list.d/nginx-agent.list + ``` + +1. To install `nginx-agent`, run the following commands: + + ```shell + sudo apt update + sudo apt install nginx-agent + ``` + +#### Install NGINX Agent on Debian + +1. Install the prerequisites: + + ```shell + sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring + ``` + +1. Import an official nginx signing key so apt could verify the packages authenticity. Fetch the key: + + ```shell + curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ + | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null + ``` + +1. Verify that the downloaded file contains the proper key: + + ```shell + gpg --dry-run --quiet --no-keyring \ + --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg + ``` + + The output should contain the full fingerprint `573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62` as follows: + + ``` + pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] + 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 + uid nginx signing key + ``` + + {{< important >}}If the fingerprint is different, remove the file.{{< /important >}} + +1. Add the `nginx-agent` repository: + + ```shell + echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \ + http://packages.nginx.org/nginx-agent/debian/ `lsb_release -cs` agent" \ | sudo tee /etc/apt/sources.list.d/nginx-agent.list + ``` + +1. To install `nginx-agent`, run the following commands: + + ```shell + sudo apt update + sudo apt install nginx-agent + ``` + +#### Install NGINX Agent on SLES + +1. Install the prerequisites: + + ```shell + sudo zypper install curl ca-certificates gpg2 gawk + ``` + +1. To set up the zypper repository for `nginx-agent` packages, run the following command: + + ```shell + sudo zypper addrepo --gpgcheck --refresh --check \ + 'http://packages.nginx.org/nginx-agent/sles/$releasever_major' nginx-agent + ``` + +1. Next, import an official NGINX signing key so `zypper`/`rpm` can verify the package's authenticity. Fetch the key: + + ```shell + curl -o /tmp/nginx_signing.key https://nginx.org/keys/nginx_signing.key + ``` + +1. Verify that the downloaded file contains the proper key: + + ```shell + gpg --with-fingerprint --dry-run --quiet --no-keyring --import --import-options import-show /tmp/nginx_signing.key + ``` + +1. The output should contain the full fingerprint `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62` as follows: + + ``` + pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] + 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62 + uid nginx signing key + ``` + +1. Finally, import the key to the rpm database: + + ```shell + sudo rpmkeys --import /tmp/nginx_signing.key + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo zypper install nginx-agent + ``` + +#### Install NGINX Agent on Alpine Linux + +1. Install the prerequisites: + + ```shell + sudo apk add openssl curl ca-certificates + ``` + +1. To set up the apk repository for `nginx-agent` packages, run the following command: + + ```shell + printf "%s%s%s\n" \ + "http://packages.nginx.org/nginx-agent/alpine/v" \ + `grep -o -E '^[0-9]+\.[0-9]+' /etc/alpine-release` \ + "/main" \ + | sudo tee -a /etc/apk/repositories + ``` + +1. Next, import an official NGINX signing key so apk can verify the package's authenticity. Fetch the key: + + ```shell + curl -o /tmp/nginx_signing.rsa.pub https://nginx.org/keys/nginx_signing.rsa.pub + ``` + +1. Verify that downloaded file contains the proper key: + + ```shell + openssl rsa -pubin -in /tmp/nginx_signing.rsa.pub -text -noout + ``` + + The output should contain the following modulus: + + ``` + Public-Key: (2048 bit) + Modulus: + 00:fe:14:f6:0a:1a:b8:86:19:fe:cd:ab:02:9f:58: + 2f:37:70:15:74:d6:06:9b:81:55:90:99:96:cc:70: + 5c:de:5b:e8:4c:b2:0c:47:5b:a8:a2:98:3d:11:b1: + f6:7d:a0:46:df:24:23:c6:d0:24:52:67:ba:69:ab: + 9a:4a:6a:66:2c:db:e1:09:f1:0d:b2:b0:e1:47:1f: + 0a:46:ac:0d:82:f3:3c:8d:02:ce:08:43:19:d9:64: + 86:c4:4e:07:12:c0:5b:43:ba:7d:17:8a:a3:f0:3d: + 98:32:b9:75:66:f4:f0:1b:2d:94:5b:7c:1c:e6:f3: + 04:7f:dd:25:b2:82:a6:41:04:b7:50:93:94:c4:7c: + 34:7e:12:7c:bf:33:54:55:47:8c:42:94:40:8e:34: + 5f:54:04:1d:9e:8c:57:48:d4:b0:f8:e4:03:db:3f: + 68:6c:37:fa:62:14:1c:94:d6:de:f2:2b:68:29:17: + 24:6d:f7:b5:b3:18:79:fd:31:5e:7f:4c:be:c0:99: + 13:cc:e2:97:2b:dc:96:9c:9a:d0:a7:c5:77:82:67: + c9:cb:a9:e7:68:4a:e1:c5:ba:1c:32:0e:79:40:6e: + ef:08:d7:a3:b9:5d:1a:df:ce:1a:c7:44:91:4c:d4: + 99:c8:88:69:b3:66:2e:b3:06:f1:f4:22:d7:f2:5f: + ab:6d + Exponent: 65537 (0x10001) + ``` + +1. Finally, move the key to apk trusted keys storage: + + ```shell + sudo mv /tmp/nginx_signing.rsa.pub /etc/apk/keys/ + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo apk add nginx-agent + ``` + +#### Install NGINX Agent on Amazon Linux + +1. Install the prerequisites: + + ```shell + sudo yum install yum-utils procps + ``` + +1. To set up the yum repository for Amazon Linux 2, create the file named `/etc/yum.repos.d/nginx-agent.repo` with the following contents: + ``` + [nginx-agent] + name=nginx agent repo + baseurl=http://packages.nginx.org/nginx-agent/amzn2/$releasever/$basearch/ + gpgcheck=1 + enabled=1 + gpgkey=https://nginx.org/keys/nginx_signing.key + module_hotfixes=true + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo yum install nginx-agent + ``` + +1. When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. + +#### Install NGINX Agent on FreeBSD + +1. To setup the pkg repository create the file named `/etc/pkg/nginx-agent.conf` with the following content: + + ``` + nginx-agent: { + URL: pkg+http://packages.nginx.org/nginx-agent/freebsd/${ABI}/latest + ENABLED: true + MIRROR_TYPE: SRV + } + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo pkg install nginx-agent + ``` + +## NGINX Plus repository + +Before you install NGINX Agent, you must install and run NGINX Plus. + +If you don’t have it installed already, read the [Installing NGINX Plus +](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-plus/) topic. + +You will also need the following: + +- Your credentials to the MyF5 Customer Portal, provided by email from F5, Inc. +- An NGINX Plus subscription (Full or trial) +- Your NGINX Plus certificate and public key (`nginx-repo.crt` and `nginx-repo.key` files), provided by email from F5, Inc. + +### Configure NGINX Plus Repository for installing NGINX Agent + +Before you install NGINX Agent for the first time on your system, you need to set up the `nginx-agent` packages repository. Afterward, you can install and update NGINX Agent from the repository. + +- [Install NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux](#install-nginx-agent-on-rhel-centos-rocky-linux-almalinux-and-oracle-linux) +- [Install NGINX Agent on Ubuntu](#install-nginx-agent-on-ubuntu) +- [Install NGINX Agent on Debian](#install-nginx-agent-on-debian) +- [Install NGINX Agent on SLES](#install-nginx-agent-on-sles) +- [Install NGINX Agent on Alpine Linux](#install-nginx-agent-on-alpine-linux) +- [Install NGINX Agent on Amazon Linux](#install-nginx-agent-on-amazon-linux) +- [Install NGINX Agent on FreeBSD](#install-nginx-agent-on-freebsd) + +#### Install NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux + +1. Create the `/etc/ssl/nginx` directory: + + ```shell + sudo mkdir -p /etc/ssl/nginx + ``` + +1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. + +1. Copy the files to the `/etc/ssl/nginx/` directory: + + ```shell + sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ + ``` + +1. Install the prerequisites: + + ```shell + sudo yum install yum-utils procps + ``` + +1. Set up the yum repository by creating the file `nginx-agent.repo` in `/etc/yum.repos.d`, for example using `vi`: + + ```shell + sudo vi /etc/yum.repos.d/nginx-agent.repo + ``` + +1. Add the following lines to `nginx-agent.repo`: + + ``` + [nginx-agent] + name=nginx agent repo + baseurl=https://pkgs.nginx.com/nginx-agent/centos/$releasever/$basearch/ + sslclientcert=/etc/ssl/nginx/nginx-repo.crt + sslclientkey=/etc/ssl/nginx/nginx-repo.key + gpgcheck=0 + enabled=1 + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo yum install nginx-agent + ``` + + When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. + +#### Install NGINX Agent on Ubuntu + +1. Create the `/etc/ssl/nginx` directory: + + ```shell + sudo mkdir -p /etc/ssl/nginx + ``` + +1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. + +1. Copy the files to the `/etc/ssl/nginx/` directory: + + ```shell + sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ + ``` + +1. Install the prerequisites: + + ```shell + sudo apt-get install apt-transport-https lsb-release ca-certificates wget gnupg2 ubuntu-keyring + ``` + +1. Download and add [NGINX signing key](https://cs.nginx.com/static/keys/nginx_signing.key): + + ```shell + wget -qO - https://cs.nginx.com/static/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null + ``` + +1. Create `apt` configuration `/etc/apt/apt.conf.d/90pkgs-nginx`: + + ``` + Acquire::https::pkgs.nginx.com::Verify-Peer "true"; + Acquire::https::pkgs.nginx.com::Verify-Host "true"; + Acquire::https::pkgs.nginx.com::SslCert "/etc/ssl/nginx/nginx-repo.crt"; + Acquire::https::pkgs.nginx.com::SslKey "/etc/ssl/nginx/nginx-repo.key"; + ``` + +1. Add the `nginx-agent` repository: + + ```shell + echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://pkgs.nginx.com/nginx-agent/ubuntu/ `lsb_release -cs` agent" \ + | sudo tee /etc/apt/sources.list.d/nginx-agent.list + ``` + +1. To install `nginx-agent`, run the following commands: + + ```shell + sudo apt update + sudo apt install nginx-agent + ``` + +#### Install NGINX Agent on Debian + +1. Create the `/etc/ssl/nginx` directory: + + ```shell + sudo mkdir -p /etc/ssl/nginx + ``` + +1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. + +1. Copy the files to the `/etc/ssl/nginx/` directory: + + ```shell + sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ + ``` + +1. Install the prerequisites: + + ```shell + sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring + ``` + +1. Add the `nginx-agent` repository: + + ```shell + echo "deb https://pkgs.nginx.com/nginx-agent/debian/ `lsb_release -cs` agent" \ + | sudo tee /etc/apt/sources.list.d/nginx-agent.list + ``` + +1. Create apt configuration `/etc/apt/apt.conf.d/90pkgs-nginx`: + + ``` + Acquire::https::pkgs.nginx.com::Verify-Peer "true"; + Acquire::https::pkgs.nginx.com::Verify-Host "true"; + Acquire::https::pkgs.nginx.com::SslCert "/etc/ssl/nginx/nginx-repo.crt"; + Acquire::https::pkgs.nginx.com::SslKey "/etc/ssl/nginx/nginx-repo.key"; + ``` + +1. To install `nginx-agent`, run the following commands: + + ```shell + sudo apt update + sudo apt install nginx-agent + ``` + +#### Install NGINX Agent on SLES + +1. Create the `/etc/ssl/nginx` directory: + + ```shell + sudo mkdir -p /etc/ssl/nginx + ``` + +1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. + +1. Copy the files to the `/etc/ssl/nginx/` directory: + + ```shell + sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ + ``` + +1. Create a file bundle of the certificate and key: + + ```shell + cat /etc/ssl/nginx/nginx-repo.crt /etc/ssl/nginx/nginx-repo.key > /etc/ssl/nginx/nginx-repo-bundle.crt + ``` + +1. Install the prerequisites: + + ```shell + sudo zypper install curl ca-certificates gpg2 gawk + ``` + +1. To set up the zypper repository for `nginx-agent` packages, run the following command: + + ```shell + sudo zypper addrepo --refresh --check \ + 'https://pkgs.nginx.com/nginx-agent/sles/$releasever_major?ssl_clientcert=/etc/ssl/nginx/nginx-repo-bundle.crt&ssl_verify=peer' nginx-agent + ``` + +1. Next, import an official NGINX signing key so `zypper`/`rpm` can verify the package's authenticity. Fetch the key: + + ```shell + curl -o /tmp/nginx_signing.key https://nginx.org/keys/nginx_signing.key + ``` + +1. Verify that the downloaded file contains the proper key: + + ```shell + gpg --with-fingerprint --dry-run --quiet --no-keyring --import --import-options import-show /tmp/nginx_signing.key + ``` + +1. The output should contain the full fingerprint `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62` as follows: + + ``` + pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] + 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62 + uid nginx signing key + ``` + +1. Finally, import the key to the rpm database: + + ```shell + sudo rpmkeys --import /tmp/nginx_signing.key + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo zypper install nginx-agent + ``` + +#### Install NGINX Agent on Alpine Linux + +1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. + +1. Copy the files to the `/etc/apk/` directory: + + ```shell + sudo cp nginx-repo.key /etc/apk/cert.key + sudo cp nginx-repo.crt /etc/apk/cert.pem + ``` + +1. Install the prerequisites: + + ```shell + sudo apk add openssl curl ca-certificates + ``` + +1. To set up the apk repository for `nginx-agent` packages, run the following command: + + ```shell + printf "%s%s%s\n" \ + "https://pkgs.nginx.com/nginx-agent/alpine/v" \ + `grep -o -E '^[0-9]+\.[0-9]+' /etc/alpine-release` \ + "/main" \ + | sudo tee -a /etc/apk/repositories + ``` + +1. Next, import an official NGINX signing key so apk can verify the package's authenticity. Fetch the key: + + ```shell + curl -o /tmp/nginx_signing.rsa.pub https://nginx.org/keys/nginx_signing.rsa.pub + ``` + +1. Verify that downloaded file contains the proper key: + + ```shell + openssl rsa -pubin -in /tmp/nginx_signing.rsa.pub -text -noout + ``` + + The output should contain the following modulus: + + ``` + Public-Key: (2048 bit) + Modulus: + 00:fe:14:f6:0a:1a:b8:86:19:fe:cd:ab:02:9f:58: + 2f:37:70:15:74:d6:06:9b:81:55:90:99:96:cc:70: + 5c:de:5b:e8:4c:b2:0c:47:5b:a8:a2:98:3d:11:b1: + f6:7d:a0:46:df:24:23:c6:d0:24:52:67:ba:69:ab: + 9a:4a:6a:66:2c:db:e1:09:f1:0d:b2:b0:e1:47:1f: + 0a:46:ac:0d:82:f3:3c:8d:02:ce:08:43:19:d9:64: + 86:c4:4e:07:12:c0:5b:43:ba:7d:17:8a:a3:f0:3d: + 98:32:b9:75:66:f4:f0:1b:2d:94:5b:7c:1c:e6:f3: + 04:7f:dd:25:b2:82:a6:41:04:b7:50:93:94:c4:7c: + 34:7e:12:7c:bf:33:54:55:47:8c:42:94:40:8e:34: + 5f:54:04:1d:9e:8c:57:48:d4:b0:f8:e4:03:db:3f: + 68:6c:37:fa:62:14:1c:94:d6:de:f2:2b:68:29:17: + 24:6d:f7:b5:b3:18:79:fd:31:5e:7f:4c:be:c0:99: + 13:cc:e2:97:2b:dc:96:9c:9a:d0:a7:c5:77:82:67: + c9:cb:a9:e7:68:4a:e1:c5:ba:1c:32:0e:79:40:6e: + ef:08:d7:a3:b9:5d:1a:df:ce:1a:c7:44:91:4c:d4: + 99:c8:88:69:b3:66:2e:b3:06:f1:f4:22:d7:f2:5f: + ab:6d + Exponent: 65537 (0x10001) + ``` + +1. Finally, move the key to apk trusted keys storage: + + ```shell + sudo mv /tmp/nginx_signing.rsa.pub /etc/apk/keys/ + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo apk add nginx-agent + ``` + +#### Install NGINX Agent on Amazon Linux + +1. Create the `/etc/ssl/nginx` directory: + + ```shell + sudo mkdir -p /etc/ssl/nginx + ``` + +1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. + +1. Copy the `nginx-repo.crt` and `nginx-repo.key` files to the `/etc/ssl/nginx/` directory: + + ```shell + sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ + ``` + +1. Install the prerequisites: + + ```shell + sudo yum install yum-utils procps ca-certificates + ``` + +1. To set up the yum repository for Amazon Linux 2, create the file named `/etc/yum.repos.d/nginx-agent.repo` with the following contents: + + ``` + [nginx-agent] + name=nginx-agent repo + baseurl=https://pkgs.nginx.com/nginx-agent/amzn2/$releasever/$basearch + sslclientcert=/etc/ssl/nginx/nginx-repo.crt + sslclientkey=/etc/ssl/nginx/nginx-repo.key + gpgcheck=0 + enabled=1 + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo yum install nginx-agent + ``` + +1. When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. + +#### Install NGINX Agent on FreeBSD + +1. Create the `/etc/ssl/nginx` directory: + + ```shell + sudo mkdir -p /etc/ssl/nginx + ``` + +1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. + +1. Copy the files to the `/etc/ssl/nginx/` directory: + + ```shell + sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ + ``` + +1. Install the prerequisite `ca_root_nss` package: + + ```shell + sudo pkg install ca_root_nss + ``` + +1. To setup the pkg repository create the file named `/etc/pkg/nginx-agent.conf` with the following content: + + ``` + nginx-agent: { + URL: pkg+https://pkgs.nginx.com/nginx-agent/freebsd/${ABI}/latest + ENABLED: yes + MIRROR_TYPE: SRV + } + ``` + +1. Add the following lines to the `/usr/local/etc/pkg.conf` file: + + ``` + PKG_ENV: { SSL_NO_VERIFY_PEER: "1", + SSL_CLIENT_CERT_FILE: "/etc/ssl/nginx/nginx-repo.crt", + SSL_CLIENT_KEY_FILE: "/etc/ssl/nginx/nginx-repo.key" } + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo pkg install nginx-agent + ``` + +## GitHub package files + +To install NGINX Agent on your system, go to the [GitHub releases page](https://github.com/nginx/agent/releases) and download the latest package supported by your operating system distribution and CPU architecture. + +Use your system's package manager to install the package. Some examples: + +- Debian, Ubuntu, and other distributions using the `dpkg` package manager. + + ```shell + sudo dpkg -i nginx-agent-.deb + ``` + +- RHEL, CentOS RHEL, Amazon Linux, Oracle Linux, and other distributions using the `yum` package manager + + ```shell + sudo yum localinstall nginx-agent-.rpm + ``` + +- RHEL and other distributions using the `rpm` package manager + + ```shell + sudo rpm -i nginx-agent-.rpm + ``` + +- Alpine Linux + + ```shell + sudo apk add nginx-agent-.apk + ``` + +- FreeBSD + + ```shell + sudo pkg add nginx-agent-.pkg + ``` + +## systemd environments + +To start NGINX Agent on `systemd` systems, run the following command: + +```shell +sudo systemctl start nginx-agent +``` + +To enable NGINX Agent to start on boot, run the following command: + +```shell +sudo systemctl enable nginx-agent +``` + +## Verify that NGINX Agent is running + +Once you have installed NGINX Agent, you can verify that it is running with the following command: + +```shell +sudo nginx-agent -v +``` + +## Enable interfaces + +Once NGINX Agent is successfully running, you can enable the required interfaces, which is described in the [Enable gRPC and REST interfaces]({{< relref "/how-to/enable-interfaces.md" >}}) topic. + +You may also be interested in the [Start mock control plane interface]({{< relref "/contribute/start-mock-interface.md" >}}) topic for development work. \ No newline at end of file diff --git a/site/content/install-upgrade/migrate-v3.md b/site/content/install-upgrade/migrate-v3.md new file mode 100644 index 0000000000..fe9a0533f3 --- /dev/null +++ b/site/content/install-upgrade/migrate-v3.md @@ -0,0 +1,44 @@ +--- +title: Migrate from NGINX Agent v2 to v3 +weight: 500 +docs: DOCS-000 +--- + +This topic describes how to migrate from F5 NGINX Agent v2 to NGINX Agent v3. + +[//]: # "These are Markdown comments to guide you through document structure." +[//]: # "Remove them as you go, as well as unnecessary sections for this use case." + +## Overview + +[//]: # "Write a description which outlines precisely what this page of instructions will accomplish." +[//]: # "This description, like all instructions, should be direct and imperative." +[//]: # "Avoid ambiguous promises such as 'enables functionality': state precisely what it does." + +--- + +## Before you begin + +[//]: # "List all of the prerequisites for completing this task." +[//]: # "This might be the first page for a reader, so include a link to installation." + +To begin this task, you will require the following: + +- A [working NGINX Agent instance]({{< ref "/install-upgrade/install.md" >}}). +- +- + +--- + +## Migrate from NGINX Agent v2 to v3 + + +--- + +## See also + +[//]: # "Examples of additional topics users might want to read include:" +[//]: # "Relevant reference information, configuration options and more complex use cases." + +- +- diff --git a/site/content/install-upgrade/uninstall.md b/site/content/install-upgrade/uninstall.md new file mode 100644 index 0000000000..7fe869d585 --- /dev/null +++ b/site/content/install-upgrade/uninstall.md @@ -0,0 +1,145 @@ +--- +title: "Uninstall NGINX Agent" +toc: true +weight: 300 +docs: DOCS-000 +--- + +## Overview + +Learn how to uninstall F5 NGINX Agent from your system. + +## Before you begin + +### Prerequisites + +- NGINX Agent installed [NGINX Agent installed](../installation-oss) +- The user following these steps will need `root` privilege + +## Uninstall NGINX Agent +Complete the following steps on each host where you’ve installed NGINX Agent + + +- [Uninstall NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux](#uninstall-nginx-agent-on-rhel-centos-rocky-linux-almalinux-and-oracle-linux) +- [Uninstall NGINX Agent on Ubuntu](#uninstall-nginx-agent-on-ubuntu) +- [Uninstall NGINX Agent on Debian](#uninstall-nginx-agent-on-debian) +- [Uninstall NGINX Agent on SLES](#uninstall-nginx-agent-on-sles) +- [Uninstall NGINX Agent on Alpine Linux](#uninstall-nginx-agent-on-alpine-linux) +- [Uninstall NGINX Agent on Amazon Linux](#uninstall-nginx-agent-on-amazon-linux) +- [Uninstall NGINX Agent on FreeBSD](#uninstall-nginx-agent-on-freebsd) + +### Uninstall NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux + +Complete the following steps on each host where you've installed NGINX Agent: + +1. Stop NGINX Agent: + + ```shell + sudo systemctl stop nginx-agent + ``` + +1. To uninstall NGINX Agent, run the following command: + + ```shell + sudo yum remove nginx-agent + ``` + +### Uninstall NGINX Agent on Ubuntu + +Complete the following steps on each host where you've installed NGINX Agent: + +1. Stop NGINX Agent: + + ```shell + sudo systemctl stop nginx-agent + ``` + +1. To uninstall NGINX Agent, run the following command: + + ```shell + sudo apt-get remove nginx-agent + ``` + + {{< note >}} The `apt-get remove ` command will remove the package from your system, while keeping the associated configuration files for possible future use. If you want to completely remove the package and all of its configuration files, you should use `apt-get purge `. {{< /note >}} + +### Uninstall NGINX Agent on Debian + +Complete the following steps on each host where you've installed NGINX Agent: + +1. Stop NGINX Agent: + + ```shell + sudo systemctl stop nginx-agent + ``` + +1. To uninstall NGINX Agent, run the following command: + + ```shell + sudo apt-get remove nginx-agent + ``` + + {{< note >}} The `apt-get remove ` command will remove the package from your system, while keeping the associated configuration files for possible future use. If you want to completely remove the package and all of its configuration files, you should use `apt-get purge `. {{< /note >}} + +### Uninstall NGINX Agent on SLES + +Complete the following steps on each host where you've installed NGINX Agent: + +1. Stop NGINX agent: + + ```shell + sudo systemctl stop nginx-agent + ``` + +1. To uninstall NGINX agent, run the following command: + + ```shell + sudo zypper remove nginx-agent + ``` + +### Uninstall NGINX Agent on Alpine Linux + +Complete the following steps on each host where you've installed NGINX agent: + +1. Stop NGINX agent: + + ```shell + sudo rc-service nginx-agent stop + ``` + +1. To uninstall NGINX agent, run the following command: + + ```shell + sudo apk del nginx-agent + ``` + +### Uninstall NGINX Agent on Amazon Linux + +Complete the following steps on each host where you've installed NGINX agent: + +1. Stop NGINX agent: + + ```shell + sudo systemctl stop nginx-agent + ``` + +1. To uninstall NGINX agent, run the following command: + + ```shell + sudo yum remove nginx-agent + ``` + +### Uninstall NGINX Agent on FreeBSD + +Complete the following steps on each host where you've installed NGINX agent: + +1. Stop NGINX agent: + + ```shell + sudo service nginx-agent stop + ``` + +1. To uninstall NGINX agent, run the following command: + + ```shell + sudo pkg delete nginx-agent + ``` diff --git a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/upgrade.md b/site/content/install-upgrade/upgrade.md similarity index 91% rename from site/content/previous-versions/NGINX-agent-v2/installation-upgrade/upgrade.md rename to site/content/install-upgrade/upgrade.md index bf5bb90c49..55898a2bb7 100644 --- a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/upgrade.md +++ b/site/content/install-upgrade/upgrade.md @@ -1,17 +1,13 @@ --- -title: "Upgrade NGINX Agent Package" -draft: false -weight: 600 +title: "Upgrade NGINX Agent" toc: true -tags: [ "docs" ] -docs: "DOCS-1227" -categories: ["configuration"] -doctypes: ["task"] +weight: 200 +docs: DOCS-000 --- ## Overview -Learn how to upgrade NGINX Agent. +Learn how to upgrade F5 NGINX Agent. ## Upgrade NGINX Agent from version v2.31.0 or greater @@ -42,8 +38,6 @@ To upgrade NGINX Agent, follow these steps: sudo apt-get install -y --only-upgrade nginx-agent -o Dpkg::Options::="--force-confold" ``` - - ## Upgrade NGINX Agent from a version less than v2.31.0 To upgrade NGINX Agent, take the following steps: diff --git a/site/content/metrics.md b/site/content/metrics.md new file mode 100644 index 0000000000..179f413b96 --- /dev/null +++ b/site/content/metrics.md @@ -0,0 +1,5 @@ +--- +title: OpenTelemetry metrics +weight: 300 +docs: DOCS-000 +--- \ No newline at end of file diff --git a/site/content/overview.md b/site/content/overview.md deleted file mode 100644 index 76e16c8e69..0000000000 --- a/site/content/overview.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "Overview" -draft: false -weight: 100 -toc: true -tags: [ "docs" ] -categories: ["configuration"] -doctypes: ["task"] ---- - -## Overview - -NGINX Agent is a companion daemon for your NGINX Open Source or NGINX Plus instance. It enables: - -- Remote management of NGINX configurations -- Collection and reporting of real-time NGINX performance and operating system metrics -- Notifications of NGINX events - - -{{< 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 - -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 - -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 - -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. - -## 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>}}
{{}} -{{}} -| Event | Description | -| -------------------------------- | -------------------------------------------- | -| AGENT_START_MESSAGE | Agent process started | -| AGENT_STOP_MESSAGE | Agent process stopped | -| NGINX_FOUND_MESSAGE | NGINX master process detected on system | -| NGINX_STOP_MESSAGE | NGINX master process stopped | -| NGINX_RELOAD_SUCCESS_MESSAGE | NGINX master process reloaded successfully | -| NGINX_RELOAD_FAILED_MESSAGE | NGINX master process failed to reload | -| NGINX_WORKER_START_MESSAGE | New NGINX worker process started | -| NGINX_WORKER_STOP_MESSAGE | NGINX worker process stopped | -| CONFIG_APPLY_SUCCESS_MESSAGE | Successfully applied new NGINX configuration | -| CONFIG_APPLY_FAILURE_MESSAGE | Failed to apply new NGINX configuration | -| CONFIG_ROLLBACK_SUCCESS_MESSAGE | Successfully rolled back NGINX configuration | -| CONFIG_ROLLBACK_FAILURE_MESSAGE | Failed to roll back NGINX configuration | -{{}} -{{< raw-html>}}
{{}} - - diff --git a/site/content/previous-versions/NGINX-agent-v2/changelog.md b/site/content/previous-versions/NGINX-agent-v2/changelog.md deleted file mode 100644 index d4c587926b..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/changelog.md +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: "Changelog" -weight: 1200 -toc: true -docs: "DOCS-1093" ---- - -{{< note >}}You can find the full changelog, contributor list and assets for NGINX Agent in the [GitHub repository](https://github.com/nginx/agent/releases).{{< /note >}} - -See the list of supported Operating Systems and architectures in the [Technical Specifications]({{< relref "./technical-specifications.md" >}}). - ---- -## Release [v2.32.2](https//github.com/nginx/agent/releases/tag/v2.32.2) - -### 🌟 Highlights - -- This release fixes an issue where certain container runtimes were reporting as bare-metal hosts. - -### 🚀 Features - -This release introduces the following new features: - -- feat: improve docker docs by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#587](https://github.com/nginx/agent/pull/587) - -### 🐛 Bug Fixes - -In this release we have resolved the following issues: - -- Fix install-tools by [@Dean-Coakley](https://github.com/Dean-Coakley) in [#581](https://github.com/nginx/agent/pull/581) - -### 📝 Documentation - -We have made the following updates to the documentation: - -- change log updated for last release by [@oliveromahony](https://github.com/oliveromahony) in [#583](https://github.com/nginx/agent/pull/583) -- Restore agent container information from nms docs by [@jputrino](https://github.com/jputrino) in [#584](https://github.com/nginx/agent/pull/584) -- fix: add additional container checks during instance registration by [@mattdesmarais](https://github.com/mattdesmarais) in [#592](https://github.com/nginx/agent/pull/592) - ---- -## Release [v2.32.1](https//github.com/nginx/agent/releases/tag/v2.32.1) - -### 🚀 Features - -This release introduces the following new features: - -- feat: Agent Docs IA refactor by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#548](https://github.com/nginx/agent/pull/548) -- feat: move NMS agent docs by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#553](https://github.com/nginx/agent/pull/553) -- feat: import changelog from github by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#570](https://github.com/nginx/agent/pull/570) - -### 🐛 Bug Fixes - -In this release we have resolved the following issues: - -- fix runners and bump go version by [@oliveromahony](https://github.com/oliveromahony) in [#550](https://github.com/nginx/agent/pull/550) -- Fix artifact name by [@oliveromahony](https://github.com/oliveromahony) in [#558](https://github.com/nginx/agent/pull/558) -- fix: add missing catalog entry by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#572](https://github.com/nginx/agent/pull/572) - -### 📝 Documentation - -We have made the following updates to the documentation: - -- Runc bump by [@oliveromahony](https://github.com/oliveromahony) in [#565](https://github.com/nginx/agent/pull/565) - -### 🔨 Maintenance - -We have made the following maintenance-related minor changes: - -- bump vulnerable version of buildkit by [@oliveromahony](https://github.com/oliveromahony) in [#564](https://github.com/nginx/agent/pull/564) - ---- -## Release [v2.32.0](https//github.com/nginx/agent/releases/tag/v2.32.0) - -### 🚀 Features - -This release introduces the following new features: - -- feat: added the new OS support for NGINX R31 by [@oliveromahony](https://github.com/oliveromahony) in [#538](https://github.com/nginx/agent/pull/538) - ---- -## Release [v2.31.2](https//github.com/nginx/agent/releases/tag/v2.31.2) - -### 🐛 Bug Fixes - -In this release we have resolved the following issues: - -- chore: rename hugo folder to site, fix product naming by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#527](https://github.com/nginx/agent/pull/527) - -### 📝 Documentation - -We have made the following updates to the documentation: - -- Update upgrade documentation by [@dhurley](https://github.com/dhurley) in [#526](https://github.com/nginx/agent/pull/526) -- Bump the versions of containerd and go-git dependencies by [@dhurley](https://github.com/dhurley) in [#533](https://github.com/nginx/agent/pull/533) -- updated dependencies by [@oliveromahony](https://github.com/oliveromahony) in [#536](https://github.com/nginx/agent/pull/536) - -### 🔨 Maintenance - -We have made the following maintenance-related minor changes: - -- Bump crypto dependency from 0.14.0 to 0.17.0 by [@dhurley](https://github.com/dhurley) in [#532](https://github.com/nginx/agent/pull/532) - ---- -## Release [v2.31.1](https//github.com/nginx/agent/releases/tag/v2.31.1) - -### 🐛 Bug Fixes - -In this release we have resolved the following issues: - -- Fix permissions for log file and dynamic config directory by [@aphralG](https://github.com/aphralG) in [#517](https://github.com/nginx/agent/pull/517) -- Fix server example in sdk to have timeout by [@aphralG](https://github.com/aphralG) in [#518](https://github.com/nginx/agent/pull/518) - -### 📝 Documentation - -We have made the following updates to the documentation: - -- Update SELinux Readme by [@aphralG](https://github.com/aphralG) in [#522](https://github.com/nginx/agent/pull/522) - -### 🔨 Maintenance - -We have made the following maintenance-related minor changes: - -- Replace mockgen by [@oliveromahony](https://github.com/oliveromahony) in [#524](https://github.com/nginx/agent/pull/524) -- Restrict config apply directory permissions by [@Dean-Coakley](https://github.com/Dean-Coakley) in [#519](https://github.com/nginx/agent/pull/519) -- Restrict NAP file/dir permissions by [@Dean-Coakley](https://github.com/Dean-Coakley) in [#516](https://github.com/nginx/agent/pull/516) - ---- -## Release [v2.31.0](https//github.com/nginx/agent/releases/tag/v2.31.0) - -### 🐛 Bug Fixes - -In this release we have resolved the following issues: - -- Fix otelcontrib version by [@oliveromahony](https://github.com/oliveromahony) in [#504](https://github.com/nginx/agent/pull/504) -- Fix user agent request header to have the correct agent version by [@dhurley](https://github.com/dhurley) in [#498](https://github.com/nginx/agent/pull/498) -- Fix alpine plus dockerfile on alpine>=3.17 by [@Dean-Coakley](https://github.com/Dean-Coakley) in [#511](https://github.com/nginx/agent/pull/511) -- fix: avoid stopping nginx-agent service on package upgrade by [@defanator](https://github.com/defanator) in [#352](https://github.com/nginx/agent/pull/352) -- Fix SELinux Policy by [@aphralG](https://github.com/aphralG) in [#520](https://github.com/nginx/agent/pull/520) - -### 📝 Documentation - -We have made the following updates to the documentation: - -- Add CLI arg to set dynamic config path by [@Dean-Coakley](https://github.com/Dean-Coakley) in [#490](https://github.com/nginx/agent/pull/490) - -### 🔨 Maintenance - -We have made the following maintenance-related minor changes: - -- crossplane version bump by [@oliveromahony](https://github.com/oliveromahony) in [#512](https://github.com/nginx/agent/pull/512) -- Add commander retry lock by [@dhurley](https://github.com/dhurley) in [#502](https://github.com/nginx/agent/pull/502) -- Bump otel dependency version and fix github workflow for dependabot PRs by [@dhurley](https://github.com/dhurley) in [#515](https://github.com/nginx/agent/pull/515) - ---- -## Release [v2.30.3](https//github.com/nginx/agent/releases/tag/v2.30.3) - -### 🐛 Bug Fixes - -In this release we have resolved the following issues: - -- Fix dependabot issues by [@oliveromahony](https://github.com/oliveromahony) in [#503](https://github.com/nginx/agent/pull/503) - ---- -## Release [v2.30.1](https//github.com/nginx/agent/releases/tag/v2.30.1) - -### 🐛 Bug Fixes - -In this release we have resolved the following issues: - -- fix: Tolerate additional fields in App Protect yaml files by [@edarzins](https://github.com/edarzins) in [#494](https://github.com/nginx/agent/pull/494) - -### 🔨 Maintenance - -We have made the following maintenance-related minor changes: - -- Update nginx-plus-go-client to stop 404 errors in NGINX access logs by [@dhurley](https://github.com/dhurley) in [#495](https://github.com/nginx/agent/pull/495) - ---- -## Release [v2.30.0](https//github.com/nginx/agent/releases/tag/v2.30.0) - -### 🐛 Bug Fixes - -In this release we have resolved the following issues: - -- Fix version for forked repo by [@dhurley](https://github.com/dhurley) in [#468](https://github.com/nginx/agent/pull/468) -- Fix integration tests by [@aphralG](https://github.com/aphralG) in [#478](https://github.com/nginx/agent/pull/478) -- Fix config apply by [@oliveromahony](https://github.com/oliveromahony) in [#480](https://github.com/nginx/agent/pull/480) -- deprecate system.mem.used.all metric by [@aphralG](https://github.com/aphralG) in [#485](https://github.com/nginx/agent/pull/485) - -### 📝 Documentation - -We have made the following updates to the documentation: - -- Update CLI flags documentation by [@Dean-Coakley](https://github.com/Dean-Coakley) in [#476](https://github.com/nginx/agent/pull/476) -- Update NGINX plugin to read NGINX config on startup by [@dhurley](https://github.com/dhurley) in [#489](https://github.com/nginx/agent/pull/489) - -### 🔨 Maintenance - -We have made the following maintenance-related minor changes: - -- Update file watcher to ignore .swx files by [@dhurley](https://github.com/dhurley) in [#466](https://github.com/nginx/agent/pull/466) -- Check Simplemetrics is not empty by [@aphralG](https://github.com/aphralG) in [#474](https://github.com/nginx/agent/pull/474) -- Add error log if duplicate NGINX IDs are found by [@dhurley](https://github.com/dhurley) in [#477](https://github.com/nginx/agent/pull/477) -- Add tests for additional SSL directives and key algorithms. [#276](https://github.com/nginx/agent/issues/276) by [@arsenalzp](https://github.com/arsenalzp) in [#469](https://github.com/nginx/agent/pull/469) -- call underlying os.Hostname instead of the entire hostInfo gopsutil call by [@oliveromahony](https://github.com/oliveromahony) in [#479](https://github.com/nginx/agent/pull/479) -- Add grpc integration tests by [@dhurley](https://github.com/dhurley) in [#475](https://github.com/nginx/agent/pull/475) -- remove error log causing failures by [@aphralG](https://github.com/aphralG) in [#488](https://github.com/nginx/agent/pull/488) -- Use singleflight for caching environment.go calls by [@oliveromahony](https://github.com/oliveromahony) in [#481](https://github.com/nginx/agent/pull/481) -- Reduce the number of times env.Processes gets called by [@dhurley](https://github.com/dhurley) in [#482](https://github.com/nginx/agent/pull/482) -- add additional check to nginxProcesses by [@aphralG](https://github.com/aphralG) in [#483](https://github.com/nginx/agent/pull/483) -- profile.cgo by [@oliveromahony](https://github.com/oliveromahony) in [#493](https://github.com/nginx/agent/pull/493) - diff --git a/site/content/previous-versions/NGINX-agent-v2/configuration/_index.md b/site/content/previous-versions/NGINX-agent-v2/configuration/_index.md deleted file mode 100644 index 3d1fdf4e34..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/configuration/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Configuration" -description: "Learn how to configure NGINX Agent." -linkTitle: "Configuration" -weight: "400" -menu: docs ---- \ No newline at end of file diff --git a/site/content/previous-versions/NGINX-agent-v2/configuration/configuration-overview.md b/site/content/previous-versions/NGINX-agent-v2/configuration/configuration-overview.md deleted file mode 100644 index caafd40991..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/configuration/configuration-overview.md +++ /dev/null @@ -1,287 +0,0 @@ ---- -title: "Configuration Overview" -draft: false -weight: 100 -toc: true -tags: [ "docs" ] -docs: "DOCS-1229" -categories: ["configuration"] -doctypes: ["task"] ---- - -## Overview - -The following sections explain how to configure NGINX Agent using configuration files, CLI flags, and environment variables. - -{{}} - -- NGINX Agent interprets configuration values set by configuration files, CLI flags, and environment variables in the following priorities: - - 1. CLI flags overwrite configuration files and environment variable values. - 2. Environment variables overwrite configuration file values. - 3. Config files are the lowest priority and config settings are superseded if either of the other options is used. - -- You must open any required firewall ports or add SELinux/AppArmor rules for the ports and IPs you want to use. - -{{}} - -### Configure with Config Files - -The default locations of configuration files for NGINX Agent are `/etc/nginx-agent/nginx-agent.conf` and `/var/lib/nginx-agent/agent-dynamic.conf`. The `agent-dynamic.conf` file default location is different for FreeBSD which is located `/var/db/nginx-agent/agent-dynamic.conf`. These files have comments at the top indicating their purpose. - -Examples of the configuration files are provided below: - -
- example nginx-agent.conf - -{{}} -In the following example `nginx-agent.conf` file, you can change the `server.host` and `server.grpcPort` to connect to the control/management plane. -{{}} - -```nginx {hl_lines=[13]} -# -# /etc/nginx-agent/nginx-agent.conf -# -# Configuration file for NGINX Agent. -# -# This file tracks agent configuration values that are meant to be statically set. There -# are additional NGINX Agent configuration values that are set via the API and agent install script -# which can be found in /etc/nginx-agent/agent-dynamic.conf. - -# specify the server grpc port to connect to -server: - # host of the control plane - host: - grpcPort: 443 -# tls options -tls: - # enable tls in the nginx-agent setup for grpcs - # default to enable to connect with secure connection but without client cert for mtls - enable: true - # controls whether the server certificate chain and host name are verified. - # for production use, see instructions for configuring TLS - skip_verify: false -log: - # set log level (panic, fatal, error, info, debug, trace; default "info") - level: info - # set log path. if empty, don't log to file. - path: /var/log/nginx-agent/ -nginx: - # path of NGINX logs to exclude - exclude_logs: "" - # Set to true when NGINX configuration should contain no warnings when performing a configuration apply (nginx -t is used to carry out this check) - treat_warnings_as_errors: false # Default is false -# data plane status message / 'heartbeat' -dataplane: - status: - # poll interval for dataplane status - the frequency the agent will query the dataplane for changes - poll_interval: 30s - # report interval for dataplane status - the maximum duration to wait before syncing dataplane information if no updates have been observed - report_interval: 24h -metrics: - # specify the size of a buffer to build before sending metrics - bulk_size: 20 - # specify metrics poll interval - report_interval: 1m - collection_interval: 15s - mode: aggregated - -# OSS NGINX default config path -# path to aux file dirs can also be added -config_dirs: "/etc/nginx:/usr/local/etc/nginx" - -# Internal queue size -queue_size: 100 - -extensions: - - nginx-app-protect - -# Enable reporting NGINX App Protect details to the control plane. -nginx_app_protect: - # Report interval for NGINX App Protect details - the frequency NGINX Agent checks NGINX App Protect for changes. - report_interval: 15s - # Enable precompiled publication from the NGINX Management Suite (true) or perform compilation on the data plane host (false). - precompiled_publication: true -``` - -
- - -
- example dynamic-agent.conf - -{{}} -Default location in Linux environments: `/var/lib/nginx-agent/agent-dynamic.conf` - -Default location in FreeBSD environments: `/var/db/nginx-agent/agent-dynamic.conf` -{{}} - -```yaml -# Dynamic configuration file for NGINX Agent. -# -# The purpose of this file is to track agent configuration -# values that can be dynamically changed via the API and the agent install script. -# You may edit this file, but API calls that modify the tags on this system will -# overwrite the tag values in this file. -# -# The agent configuration values that API calls can modify are as follows: -# - tags -# -# The agent configuration value that the agent install script can modify are as follows: -# - instance_group - -instance_group: devenv-group -tags: - - devenv - - test -``` - -
- - -### NGINX Agent CLI Flags & Usage {#nginx-agent-cli-flags-usage} - -This section displays the configurable options for NGINX Agent that can be set with CLI flags. See the CLI flags and their uses in the figure below: - -
- NGINX Agent CLI flags & usage - -```text -Usage: - nginx-agent [flags] - nginx-agent [command] - -Available Commands: - completion Generate completion script. - help Help about any command - -Flags: - --api-cert string The cert used by the Agent API. - --api-host string The host used by the Agent API. (default "127.0.0.1") - --api-key string The key used by the Agent API. - --api-port int The desired port to use for nginx-agent to expose for HTTP traffic. - --config-dirs string Defines the paths that you want to grant nginx-agent read/write access to. This key is formatted as a string and follows Unix PATH format. (default "/etc/nginx:/usr/local/etc/nginx:/usr/share/nginx/modules:/etc/nms") - --dataplane-report-interval duration The amount of time the agent will report on the dataplane. After this period of time it will send a snapshot of the dataplane information. (default 24h0m0s) - --dataplane-status-poll-interval duration The frequency the agent will check the dataplane for changes. Used as a "heartbeat" to keep the gRPC connections alive. (default 30s) - --display-name string The instance's 'name' value. - --dynamic-config-path string Defines the path of the Agent dynamic config file. (default "/var/lib/nginx-agent/agent-dynamic.conf") - --features strings A comma-separated list of features enabled for the agent. (default [registration,nginx-config-async,nginx-ssl-config,nginx-counting,metrics,dataplane-status,process-watcher,file-watcher,activity-events,agent-api]) - -h, --help help for nginx-agent - --ignore-directives strings A comma-separated list of ignoring directives which contain sensitive info. - --instance-group string The instance's 'group' value. - --log-level string The desired verbosity level for logging messages from nginx-agent. Available options, in order of severity from highest to lowest, are: panic, fatal, error, info, debug, and trace. (default "info") - --log-path string The path to output log messages to. If the default path doesn't exist, log messages are output to stdout/stderr. - --metrics-bulk-size int The amount of metrics reports collected before sending the data back to the server. (default 20) - --metrics-collection-interval duration Sets the interval, in seconds, at which metrics are collected. (default 15s) - --metrics-mode string Sets the desired metrics collection mode: streaming or aggregation. (default "aggregated") - --metrics-report-interval duration The polling period specified for a single set of metrics being collected. (default 1m0s) - --nginx-config-reload-monitoring-period duration The duration NGINX Agent will monitor error logs after a NGINX reload (default 10s) - --nginx-exclude-logs string One or more NGINX access log paths that you want to exclude from metrics collection. This key is formatted as a string and multiple values should be provided as a comma-separated list. - --nginx-socket string The NGINX Plus counting unix socket location. (default "unix:/var/run/nginx-agent/nginx.sock") - --nginx-treat-warnings-as-errors On nginx -t, treat warnings as failures on configuration application. - --queue-size int The size of the NGINX Agent internal queue. - --server-command string The name of the command server sent in the tls configuration. - --server-grpcport int The desired GRPC port to use for nginx-agent traffic. - --server-host string The IP address of the server host. IPv4 addresses and hostnames are supported. - --server-metrics string The name of the metrics server sent in the tls configuration. - --server-token string An authentication token that grants nginx-agent access to the commander and metrics services. Auto-generated by default. (default "e202f883-54c6-4702-be15-3ba6e507879a") - --tags strings A comma-separated list of tags to add to the current instance or machine, to be used for inventory purposes. - --tls-ca string The path to the CA certificate file to use for TLS. - --tls-cert string The path to the certificate file to use for TLS. - --tls-enable Enables TLS for secure communications. - --tls-key string The path to the certificate key file to use for TLS. - --tls-skip-verify Only intended for demonstration, sets InsecureSkipVerify for gRPC TLS credentials - -v, --version version for nginx-agent - -Use "nginx-agent [command] --help" for more information about a command. -``` - -
- -#### NGINX Agent Config Dirs Option - -Use the `--config-dirs` command-line option, or the `config_dirs` key in the `nginx-agent.conf` file, to identify the directories NGINX Agent can read from or write to. This setting also defines the location to which you can upload config files when using a control/management plane. NGINX Agent cannot write to directories outside the specified location when updating a config and cannot upload files to directories outside of the configured location. -NGINX Agent follows NGINX configuration directives to file paths outside the designated directories and reads certificates' metadata. NGINX Agent uses the following directives: - -- [`ssl_certificate`](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate) - -#### NGINX Agent Dynamic Config Path Option - -Use the `--dynamic-config-path` command-line option to set the location of the dynamic config file. This setting also requires you to move your dynamic config to the new path, or create a new dynamic config file at the specified location. - -Default location in Linux environments: `/var/lib/nginx-agent/agent-dynamic.conf` - -Default location in FreeBSD environments: `/var/db/nginx-agent/agent-dynamic.conf` - -### NGINX Agent Environment Variables - -This section displays the configurable options for NGINX Agent that can be set with environment variables. A list of the configurable environment variables can be seen below: - -
- NGINX Agent Environment Variables - -```text -- NMS_INSTANCE_GROUP -- NMS_DISPLAY_NAME -- NMS_FEATURES -- NMS_LOG_LEVEL -- NMS_LOG_PATH -- NMS_PATH -- NMS_METRICS_COLLECTION_INTERVAL -- NMS_METRICS_MODE -- NMS_METRICS_BULK_SIZE -- NMS_METRICS_REPORT_INTERVAL -- NMS_NGINX_EXCLUDE_LOGS -- NMS_NGINX_SOCKET -- NMS_NGINX_TREAT_WARNINGS_AS_ERRORS -- NMS_SERVER_GRPCPORT -- NMS_SERVER_HOST -- NMS_SERVER_TOKEN -- NMS_SERVER_COMMAND -- NMS_SERVER_METRICS -- NMS_TAGS -- NMS_TLS_CA -- NMS_TLS_CERT -- NMS_TLS_ENABLE -- NMS_TLS_KEY -- NMS_TLS_SKIP_VERIFY -- NMS_CONFIG_DIRS -- NMS_QUEUE_SIZE -- NMS_DATAPLANE_REPORT_INTERVAL -- NMS_DATAPLANE_STATUS_POLL_INTERVAL -``` -
- -### NGINX Agent Log Rotation - -By default, NGINX Agent rotates logs daily using logrotate with the following configuration: - -
- NGINX Agent Logrotate Configuration - -``` yaml -/var/log/nginx-agent/*.log -{ - # log files are rotated every day - daily - # log files are rotated if they grow bigger than 5M - size 5M - # truncate the original log file after creating a copy - copytruncate - # remove rotated logs older than 10 days - maxage 10 - # log files are rotated 10 times before being removed - rotate 10 - # old log files are compressed - compress - # if the log file is missing it will go on to the next one without issuing an error message - missingok - # do not rotate the log if it is empty - notifempty -} -``` -
- -If you need to make changes to the default configuration you can update the file here `/etc/logrotate.d/nginx-agent` - -For more detail on logrotate configuration see [Logrotate Configuration Options](https://linux.die.net/man/8/logrotate) diff --git a/site/content/previous-versions/NGINX-agent-v2/contribute/_index.md b/site/content/previous-versions/NGINX-agent-v2/contribute/_index.md deleted file mode 100644 index dc79b629a7..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/contribute/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Contribute" -description: "Learn about the NGINX Agent community and contribute to the project." -linkTitle: "Contribute" -menu: docs -weight: "500" ---- \ No newline at end of file diff --git a/site/content/previous-versions/NGINX-agent-v2/contribute/community.md b/site/content/previous-versions/NGINX-agent-v2/contribute/community.md deleted file mode 100644 index 16763795dd..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/contribute/community.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Community and Contribution" -draft: false -weight: 100 -toc: true -tags: [ "docs" ] -docs: "DOCS-1087" -categories: ["configuration"] -doctypes: ["task"] ---- - -# Community - -- Our [Slack channel #nginx-agent](https://nginxcommunity.slack.com/), is the go-to place to start asking questions and sharing your thoughts. - -- Our [GitHub issues page](https://github.com/nginx/agent/issues) offers space for a more technical discussion at your own pace. - -# Contribute - -Get involved with the project by contributing! Please see our [contributing guide](https://github.com/nginx/agent/blob/main/CONTRIBUTING.md) for details. - -# License - -[Apache License, Version 2.0](https://github.com/nginx/agent/blob/main/LICENSE) diff --git a/site/content/previous-versions/NGINX-agent-v2/contribute/dev-environment-setup.md b/site/content/previous-versions/NGINX-agent-v2/contribute/dev-environment-setup.md deleted file mode 100644 index e9e3e9db03..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/contribute/dev-environment-setup.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "Development Environment Setup" -draft: false -weight: 200 -toc: true -tags: [ "docs" ] - -categories: ["development"] -doctypes: ["task"] ---- - -## Overview - -Learn how to setup a Development Environment for NGINX Agent. - -## Select an Operating System - -While most Linux or FreeBSD operating systems can be used to contribute to the NGINX Agent project, the following steps have been designed for Ubuntu. Ubuntu is packaged with most libraries required to build and run NGINX Agent, and is the recommended platform for NGINX Agent development. - -## Install NGINX - -Follow the steps in the [Installation]({{< relref "/previous-versions/NGINX-agent-v2/installation-upgrade/installation-github.md" >}}) section to download, install, and run NGINX and NGINX Agent. - -## Clone the NGINX Agent Repository - -Using your preferred method, clone the NGINX Agent repository into your development directory. See [Cloning a GitHub Repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) for additional help. - -## Installing Prerequisite Packages -Depending on the operating system distribution, it may be necessary to install the following packages in order to build NGINX Agent. - -Change to the NGINX Agent source directory: -```bash -cd /agent -``` - -Install Make: -```bash -sudo apt install make -``` - -NGINX Agent is written in Go. You may [download Go](https://go.dev/doc/install) and follow installation instructions on the same page or run: -```bash -sudo apt install golang-go -``` - -Install Protoc: -```bash -sudo apt install -y protobuf-compiler -``` - -Install NGINX Agent tools and dependencies: - -Before starting development on NGINX Agent, it is important to download and install the necessary tool and dependencies required by NGINX Agent. You can do this by running the following `make` command: -```bash -make install-tools deps -``` - -## Building NGINX Agent from Source Code - -Run the following commands to build and run NGINX Agent: - -```bash -make build -sudo make run -``` diff --git a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/_index.md b/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/_index.md deleted file mode 100644 index 211fc3e9b6..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/_index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Installation and Upgrade" -description: "Learn how to install, upgrade, and uninstall NGINX Agent." -menu: docs -weight: 300 ---- \ No newline at end of file diff --git a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/container-environments/_index.md b/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/container-environments/_index.md deleted file mode 100644 index e2de9f52c2..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/container-environments/_index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Container Environments" -description: "Learn how to build and run NGINX Agent docker images." -menu: docs -weight: 800 ---- \ No newline at end of file diff --git a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/getting-started.md b/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/getting-started.md deleted file mode 100644 index e7f3e96d69..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/getting-started.md +++ /dev/null @@ -1,181 +0,0 @@ ---- -title: "Getting Started" -draft: false -weight: 100 -toc: true -tags: [ "docs" ] -docs: "DOCS-1089" -categories: ["configuration"] -doctypes: ["task"] ---- - -## Overview - -Follow these steps to configure and run NGINX Agent and a mock interface ("control plane") to which NGINX Agent will report. - -## Install NGINX - -Follow the steps in the [Installation]({{< relref "/previous-versions/NGINX-agent-v2/installation-upgrade/installation-github.md" >}}) section to download, install, and run NGINX. - -## Clone the NGINX Agent Repository - -Using your preferred method, clone the NGINX Agent repository into your development directory. See [Cloning a GitHub Repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) for additional help. - -## Install Go - -NGINX Agent and the Mock Control Plane are written in Go. Go 1.23.0 or higher is required to build and run either application from the source code directory. You can [download Go from the official website](https://go.dev/dl/). - -## Start the gRPC Mock Control Plane - -Start the mock control plane by running the following command from the `agent` source code root directory: - -```shell -go run sdk/examples/server.go - -# Command Output -INFO[0000] http listening at 54790 # mock control plane port -INFO[0000] grpc listening at 54789 # grpc control plane port which NGINX Agent will report to -``` - -## NGINX Agent Settings - -If it doesn't already exist, create the `/etc/nginx-agent/` directory and copy the `nginx-agent.conf` file into it from the project root directory. - -```shell -sudo mkdir /etc/nginx-agent -sudo cp /nginx-agent.conf /etc/nginx-agent/ -``` - -Create the `agent-dynamic.conf` file, which is required for NGINX Agent to run. - -In Linux environments: -```shell -sudo touch /var/lib/nginx-agent/agent-dynamic.conf -``` - -In FreeBSD environments: -```shell -sudo touch /var/db/nginx-agent/agent-dynamic.conf -``` - -### Enable the gRPC interface - -Add the the following settings to `/etc/nginx-agent/nginx-agent.conf`: - -```yaml -server: - host: 127.0.0.1 # mock control plane host - grpcPort: 54789 # mock control plane gRPC port - -# gRPC TLS options - DISABLING TLS IS NOT RECOMMENDED FOR PRODUCTION -tls: - enable: false - skip_verify: true -``` - -For more information, see [Agent Protocol Definitions and Documentation](https://github.com/nginx/agent/tree/main/docs/proto/README.md). - -### Enable the REST interface - -The NGINX Agent REST interface can be exposed by validating the following lines in the `/etc/nginx-agent/nginx-agent.conf` file are present: - -```yaml -api: - # Set API address to allow remote management - host: 127.0.0.1 - # Set this value to a secure port number to prevent information leaks - port: 8038 - # REST TLS parameters - cert: ".crt" - key: ".key" -``` - -The mock control plane can use either gRPC or REST protocols to communicate with NGINX Agent. - -## Launch Swagger UI - -Swagger UI requires goswagger be installed. See [instructions for installing goswagger](https://goswagger.io/install.html) for additional help. - -To launch the Swagger UI for the REST interface run the following command: - -```shell -make launch-swagger-ui -``` - -## Extensions - -An extension is a piece of code, not critical to the main functionality that NGINX agent is responsible for. This generally falls outside the remit of managing NGINX Configuration and reporting NGINX metrics. - -To enable an extension, it must be added to the extensions list in the `/etc/nginx-agent/nginx-agent.conf`. -Here is an example of enabling the advanced metrics extension: - -```yaml -extensions: - - advanced-metrics -``` - -## Start NGINX Agent - -If already running, restart NGINX Agent to apply the new configuration. Alternatively, if NGINX Agent is not running, you may run it from the source code root directory. - -Open another terminal window and start NGINX Agent. Issue the following command from the `agent` source code root directory. - -```shell -sudo make run - -# Command Output snippet -WARN[0000] Log level is info -INFO[0000] setting displayName to XXX -INFO[0000] NGINX Agent at with pid 12345, clientID=XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX name=XXX -INFO[0000] NginxBinary initializing -INFO[0000] Commander initializing -INFO[0000] Comms initializing -INFO[0000] OneTimeRegistration initializing -INFO[0000] Registering XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX -INFO[0000] Metrics initializing -INFO[0000] MetricsThrottle initializing -INFO[0000] DataPlaneStatus initializing -INFO[0000] MetricsThrottle waiting for report ready -INFO[0000] Metrics waiting for handshake to be completed -INFO[0000] ProcessWatcher initializing -INFO[0000] Extensions initializing -INFO[0000] FileWatcher initializing -INFO[0000] FileWatchThrottle initializing -INFO[0001] Events initializing -INFO[0001] OneTimeRegistration completed -``` - -Open a web browser to view the mock control plane at [http://localhost:54790](http://localhost:54790). The following links will be shown in the web interface: - -- **registered** - shows registration information of the data plane -- **nginxes** - lists the nginx instances on the data plane -- **configs** - shows the protobuf payload for NGINX configuration sent to the management plane -- **configs/chunked** - shows the split-up payloads sent to the management plane -- **configs/raw** - shows the actual configuration as it would live on the data plane -- **metrics** - shows a buffer of metrics sent to the management plane (similar to what will be sent back in the REST API) - -For more NGINX Agent use cases, refer to the [NGINX Agent SDK examples](https://github.com/nginx/agent/tree/main/sdk/examples). - -## Start and Enable Start on Boot - -To start NGINX Agent on `systemd` systems, run the following command: - -```shell -sudo systemctl start nginx-agent -``` - -To enable NGINX Agent to start on boot, run the following command: - -```shell -sudo systemctl enable nginx-agent -``` - -## Logs - -NGINX Agent uses formatted log files to collect metrics. Expanding log formats and instance counts will also increase the size of the NGINX Agent log files. We recommend adding a separate partition for `/var/log/nginx-agent`. - -{{< important >}} -Without log rotation or storage on a separate partition, log files could use up all the free drive space and cause your system to become unresponsive to certain services. - -For more information, see [NGINX Agent Log Rotation]({{< relref "configuration/configuration-overview.md#nginx-agent-log-rotation" >}}). -{{< /important >}} diff --git a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/installation-github.md b/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/installation-github.md deleted file mode 100644 index ba507c7594..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/installation-github.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Installation From GitHub Release" -draft: false -weight: 200 -toc: true -tags: [ "docs" ] -docs: "DOCS-1090" -categories: ["configuration"] -doctypes: ["task"] ---- - -## Overview - -Learn how to install NGINX Agent from a GitHub Release. - -## Install NGINX - -NGINX Agent interfaces directly with an NGINX server process installed on the same system. If you don't have it already, follow these steps to install [NGINX Open Source](https://www.nginx.com/resources/wiki/start/topics/tutorials/install/) or [NGINX Plus](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-plus/). Once installed, ensure the NGINX instance is running. - -## Install NGINX Agent from Package Files - -To install NGINX Agent on your system, go to [GitHub Releases](https://github.com/nginx/agent/releases) and download the latest package supported by your OS distribution and CPU architecture. - -Use your system's package manager to install the package. Some examples: - -- Debian, Ubuntu, and other distributions using the `dpkg` package manager. - - ```shell - sudo dpkg -i nginx-agent-.deb - ``` - -- RHEL, CentOS RHEL, Amazon Linux, Oracle Linux, and other distributions using the `yum` package manager - - ```shell - sudo yum localinstall nginx-agent-.rpm - ``` - -- RHEL and other distributions using the `rpm` package manager - - ```shell - sudo rpm -i nginx-agent-.rpm - ``` - -- Alpine Linux - - ```shell - sudo apk add nginx-agent-.apk - ``` - -- FreeBSD - - ```shell - sudo pkg add nginx-agent-.pkg - ``` diff --git a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/installation-oss.md b/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/installation-oss.md deleted file mode 100644 index 9444700f6f..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/installation-oss.md +++ /dev/null @@ -1,350 +0,0 @@ ---- -title: "Installation From NGINX Repository" -draft: false -weight: 300 -toc: true -tags: [ "docs" ] -docs: "DOCS-1216" -categories: ["configuration"] -doctypes: ["task"] ---- - -## Overview - -Learn how to install NGINX Agent from the NGINX Open Source repository. - -## Prerequisites - -- NGINX installed. Once installed, ensure it is running. If you don't have it installed already, follow these steps to install [NGINX](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/) -- A [supported operating system and architecture](../technical-specifications/#supported-distributions) -- `root` privilege - -## Configure NGINX OSS Repository for installing NGINX Agent - -Before you install NGINX Agent for the first time on your system, you need to set up the `nginx-agent` packages repository. Afterward, you can install and update NGINX Agent from the repository. - -- [Installing NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux](#installing-nginx-agent-on-rhel-centos-rocky-linux-almalinux-and-oracle-linux) -- [Installing NGINX Agent on Ubuntu](#installing-nginx-agent-on-ubuntu) -- [Installing NGINX Agent on Debian](#installing-nginx-agent-on-debian) -- [Installing NGINX Agent on SLES](#installing-nginx-agent-on-sles) -- [Installing NGINX Agent on Alpine Linux](#installing-nginx-agent-on-alpine-linux) -- [Installing NGINX Agent on Amazon Linux](#installing-nginx-agent-on-amazon-linux) -- [Installing NGINX Agent on FreeBSD](#installing-nginx-agent-on-freebsd) - -### Installing NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux - -1. Install the prerequisites: - - ```shell - sudo yum install yum-utils - ``` - -1. To set up the yum repository, create the file named `/etc/yum.repos.d/nginx-agent.repo` with the following contents: - - ``` - [nginx-agent] - name=nginx agent repo - baseurl=http://packages.nginx.org/nginx-agent/centos/$releasever/$basearch/ - gpgcheck=1 - enabled=1 - gpgkey=https://nginx.org/keys/nginx_signing.key - module_hotfixes=true - ``` - -1. To install `nginx-agent`, run the following command: - - ```shell - sudo yum install nginx-agent - ``` - - When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. - -### Installing NGINX Agent on Ubuntu - -1. Install the prerequisites: - - ```shell - sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring - ``` - -1. Import an official nginx signing key so apt could verify the packages authenticity. Fetch the key: - - ```shell - curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ - | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null - ``` - -1. Verify that the downloaded file contains the proper key: - - ```shell - gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg - ``` - - The output should contain the full fingerprint `573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62` as follows: - - ``` - pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] - 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 - uid nginx signing key - ``` - - {{< important >}}If the fingerprint is different, remove the file.{{< /important >}} - -1. Add the nginx agent repository: - - ```shell - echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \ - http://packages.nginx.org/nginx-agent/ubuntu/ `lsb_release -cs` agent" \ - | sudo tee /etc/apt/sources.list.d/nginx-agent.list - ``` - -1. To install `nginx-agent`, run the following commands: - - ```shell - sudo apt update - sudo apt install nginx-agent - ``` - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - - -### Installing NGINX Agent on Debian - -1. Install the prerequisites: - - ```shell - sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring - ``` - -1. Import an official nginx signing key so apt could verify the packages authenticity. Fetch the key: - - ```shell - curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ - | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null - ``` - -1. Verify that the downloaded file contains the proper key: - - ```shell - gpg --dry-run --quiet --no-keyring \ - --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg - ``` - - The output should contain the full fingerprint `573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62` as follows: - - ``` - pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] - 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 - uid nginx signing key - ``` - - {{< important >}}If the fingerprint is different, remove the file.{{< /important >}} - -1. Add the `nginx-agent` repository: - - ```shell - echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \ - http://packages.nginx.org/nginx-agent/debian/ `lsb_release -cs` agent" \ | sudo tee /etc/apt/sources.list.d/nginx-agent.list - ``` - -1. To install `nginx-agent`, run the following commands: - - ```shell - sudo apt update - sudo apt install nginx-agent - ``` - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - - -### Installing NGINX Agent on SLES - -1. Install the prerequisites: - - ```shell - sudo zypper install curl ca-certificates gpg2 gawk - ``` - -1. To set up the zypper repository for `nginx-agent` packages, run the following command: - - ```shell - sudo zypper addrepo --gpgcheck --refresh --check \ - 'http://packages.nginx.org/nginx-agent/sles/$releasever_major' nginx-agent - ``` - -1. Next, import an official NGINX signing key so `zypper`/`rpm` can verify the package's authenticity. Fetch the key: - - ```shell - curl -o /tmp/nginx_signing.key https://nginx.org/keys/nginx_signing.key - ``` - -1. Verify that the downloaded file contains the proper key: - - ```shell - gpg --with-fingerprint --dry-run --quiet --no-keyring --import --import-options import-show /tmp/nginx_signing.key - ``` - -1. The output should contain the full fingerprint `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62` as follows: - - ``` - pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] - 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62 - uid nginx signing key - ``` - -1. Finally, import the key to the rpm database: - - ```shell - sudo rpmkeys --import /tmp/nginx_signing.key - ``` - -1. To install `nginx-agent`, run the following command: - - ```shell - sudo zypper install nginx-agent - ``` - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - -### Installing NGINX Agent on Alpine Linux - -1. Install the prerequisites: - - ```shell - sudo apk add openssl curl ca-certificates - ``` - -1. To set up the apk repository for `nginx-agent` packages, run the following command: - - ```shell - printf "%s%s%s\n" \ - "http://packages.nginx.org/nginx-agent/alpine/v" \ - `grep -o -E '^[0-9]+\.[0-9]+' /etc/alpine-release` \ - "/main" \ - | sudo tee -a /etc/apk/repositories - ``` - -1. Next, import an official NGINX signing key so apk can verify the package's authenticity. Fetch the key: - - ```shell - curl -o /tmp/nginx_signing.rsa.pub https://nginx.org/keys/nginx_signing.rsa.pub - ``` - -1. Verify that downloaded file contains the proper key: - - ```shell - openssl rsa -pubin -in /tmp/nginx_signing.rsa.pub -text -noout - ``` - - The output should contain the following modulus: - - ``` - Public-Key: (2048 bit) - Modulus: - 00:fe:14:f6:0a:1a:b8:86:19:fe:cd:ab:02:9f:58: - 2f:37:70:15:74:d6:06:9b:81:55:90:99:96:cc:70: - 5c:de:5b:e8:4c:b2:0c:47:5b:a8:a2:98:3d:11:b1: - f6:7d:a0:46:df:24:23:c6:d0:24:52:67:ba:69:ab: - 9a:4a:6a:66:2c:db:e1:09:f1:0d:b2:b0:e1:47:1f: - 0a:46:ac:0d:82:f3:3c:8d:02:ce:08:43:19:d9:64: - 86:c4:4e:07:12:c0:5b:43:ba:7d:17:8a:a3:f0:3d: - 98:32:b9:75:66:f4:f0:1b:2d:94:5b:7c:1c:e6:f3: - 04:7f:dd:25:b2:82:a6:41:04:b7:50:93:94:c4:7c: - 34:7e:12:7c:bf:33:54:55:47:8c:42:94:40:8e:34: - 5f:54:04:1d:9e:8c:57:48:d4:b0:f8:e4:03:db:3f: - 68:6c:37:fa:62:14:1c:94:d6:de:f2:2b:68:29:17: - 24:6d:f7:b5:b3:18:79:fd:31:5e:7f:4c:be:c0:99: - 13:cc:e2:97:2b:dc:96:9c:9a:d0:a7:c5:77:82:67: - c9:cb:a9:e7:68:4a:e1:c5:ba:1c:32:0e:79:40:6e: - ef:08:d7:a3:b9:5d:1a:df:ce:1a:c7:44:91:4c:d4: - 99:c8:88:69:b3:66:2e:b3:06:f1:f4:22:d7:f2:5f: - ab:6d - Exponent: 65537 (0x10001) - ``` - -1. Finally, move the key to apk trusted keys storage: - - ```shell - sudo mv /tmp/nginx_signing.rsa.pub /etc/apk/keys/ - ``` - -1. To install `nginx-agent`, run the following command: - - ```shell - sudo apk add nginx-agent - ``` - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - -### Installing NGINX Agent on Amazon Linux - -1. Install the prerequisites: - - ```shell - sudo yum install yum-utils procps - ``` - -1. To set up the yum repository for Amazon Linux 2, create the file named `/etc/yum.repos.d/nginx-agent.repo` with the following contents: - ``` - [nginx-agent] - name=nginx agent repo - baseurl=http://packages.nginx.org/nginx-agent/amzn2/$releasever/$basearch/ - gpgcheck=1 - enabled=1 - gpgkey=https://nginx.org/keys/nginx_signing.key - module_hotfixes=true - ``` - -1. To install `nginx-agent`, run the following command: - - ```shell - sudo yum install nginx-agent - ``` - -1. When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - -### Installing NGINX Agent on FreeBSD - -1. To setup the pkg repository create the file named `/etc/pkg/nginx-agent.conf` with the following content: - - ``` - nginx-agent: { - URL: pkg+http://packages.nginx.org/nginx-agent/freebsd/${ABI}/latest - ENABLED: true - MIRROR_TYPE: SRV - } - ``` - -1. To install `nginx-agent`, run the following command: - - ```shell - sudo pkg install nginx-agent - ``` - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` diff --git a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/installation-plus.md b/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/installation-plus.md deleted file mode 100644 index 0600eaeb1f..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/installation-plus.md +++ /dev/null @@ -1,454 +0,0 @@ ---- -title: "Installation From NGINX Plus Repository" -draft: false -weight: 400 -toc: true -tags: [ "docs" ] -docs: "DOCS-1217" -categories: ["configuration"] -doctypes: ["task"] ---- - -## Overview - -Learn how to install NGINX Agent from NGINX Plus repository - -## Prerequisites - -- An NGINX Plus subscription (purchased or trial) -- NGINX Plus installed. Once installed, ensure it is running. If you don't have it installed already, follow these steps to install [NGINX Plus](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-plus/) -- A [supported operating system and architecture](../technical-specifications/#supported-distributions) -- `root` privilege -- Your credentials to the MyF5 Customer Portal, provided by email from F5, Inc. -- Your NGINX Plus certificate and public key (`nginx-repo.crt` and `nginx-repo.key` files), provided by email from F5, Inc. - -## Configure NGINX Plus Repository for installing NGINX Agent - -Before you install NGINX Agent for the first time on your system, you need to set up the `nginx-agent` packages repository. Afterward, you can install and update NGINX Agent from the repository. - -- [Installing NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux](#installing-nginx-agent-on-rhel-centos-rocky-linux-almalinux-and-oracle-linux) -- [Installing NGINX Agent on Ubuntu](#installing-nginx-agent-on-ubuntu) -- [Installing NGINX Agent on Debian](#installing-nginx-agent-on-debian) -- [Installing NGINX Agent on SLES](#installing-nginx-agent-on-sles) -- [Installing NGINX Agent on Alpine Linux](#installing-nginx-agent-on-alpine-linux) -- [Installing NGINX Agent on Amazon Linux](#installing-nginx-agent-on-amazon-linux) -- [Installing NGINX Agent on FreeBSD](#installing-nginx-agent-on-freebsd) - -### Installing NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux - -1. Create the `/etc/ssl/nginx` directory: - - ```shell - sudo mkdir -p /etc/ssl/nginx - ``` - -1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. - -1. Copy the files to the `/etc/ssl/nginx/` directory: - - ```shell - sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ - ``` - -1. Install the prerequisites: - - ```shell - sudo yum install yum-utils procps - ``` - -1. Set up the yum repository by creating the file `nginx-agent.repo` in `/etc/yum.repos.d`, for example using `vi`: - - ```shell - sudo vi /etc/yum.repos.d/nginx-agent.repo - ``` - -1. Add the following lines to `nginx-agent.repo`: - - ``` - [nginx-agent] - name=nginx agent repo - baseurl=https://pkgs.nginx.com/nginx-agent/centos/$releasever/$basearch/ - sslclientcert=/etc/ssl/nginx/nginx-repo.crt - sslclientkey=/etc/ssl/nginx/nginx-repo.key - gpgcheck=0 - enabled=1 - ``` - -1. To install `nginx-agent`, run the following command: - - ```shell - sudo yum install nginx-agent - ``` - - When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - -### Installing NGINX Agent on Ubuntu - -1. Create the `/etc/ssl/nginx` directory: - - ```shell - sudo mkdir -p /etc/ssl/nginx - ``` - -1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. - -1. Copy the files to the `/etc/ssl/nginx/` directory: - - ```shell - sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ - ``` - -1. Install the prerequisites: - - ```shell - sudo apt-get install apt-transport-https lsb-release ca-certificates wget gnupg2 ubuntu-keyring - ``` - -1. Download and add [NGINX signing key](https://cs.nginx.com/static/keys/nginx_signing.key): - - ```shell - wget -qO - https://cs.nginx.com/static/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null - ``` - -1. Create `apt` configuration `/etc/apt/apt.conf.d/90pkgs-nginx`: - - ``` - Acquire::https::pkgs.nginx.com::Verify-Peer "true"; - Acquire::https::pkgs.nginx.com::Verify-Host "true"; - Acquire::https::pkgs.nginx.com::SslCert "/etc/ssl/nginx/nginx-repo.crt"; - Acquire::https::pkgs.nginx.com::SslKey "/etc/ssl/nginx/nginx-repo.key"; - ``` - -1. Add the `nginx-agent` repository: - - ```shell - echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://pkgs.nginx.com/nginx-agent/ubuntu/ `lsb_release -cs` agent" \ - | sudo tee /etc/apt/sources.list.d/nginx-agent.list - ``` - -1. To install `nginx-agent`, run the following commands: - - ```shell - sudo apt update - sudo apt install nginx-agent - ``` - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - - -### Installing NGINX Agent on Debian - -1. Create the `/etc/ssl/nginx` directory: - - ```shell - sudo mkdir -p /etc/ssl/nginx - ``` - -1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. - -1. Copy the files to the `/etc/ssl/nginx/` directory: - - ```shell - sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ - ``` - -1. Install the prerequisites: - - ```shell - sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring - ``` - -1. Add the `nginx-agent` repository: - - ```shell - echo "deb https://pkgs.nginx.com/nginx-agent/debian/ `lsb_release -cs` agent" \ - | sudo tee /etc/apt/sources.list.d/nginx-agent.list - ``` - -1. Create apt configuration `/etc/apt/apt.conf.d/90pkgs-nginx`: - - ``` - Acquire::https::pkgs.nginx.com::Verify-Peer "true"; - Acquire::https::pkgs.nginx.com::Verify-Host "true"; - Acquire::https::pkgs.nginx.com::SslCert "/etc/ssl/nginx/nginx-repo.crt"; - Acquire::https::pkgs.nginx.com::SslKey "/etc/ssl/nginx/nginx-repo.key"; - ``` - -1. To install `nginx-agent`, run the following commands: - - ```shell - sudo apt update - sudo apt install nginx-agent - ``` - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - -### Installing NGINX Agent on SLES - -1. Create the `/etc/ssl/nginx` directory: - - ```shell - sudo mkdir -p /etc/ssl/nginx - ``` - -1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. - -1. Copy the files to the `/etc/ssl/nginx/` directory: - - ```shell - sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ - ``` - -1. Create a file bundle of the certificate and key: - - ```shell - cat /etc/ssl/nginx/nginx-repo.crt /etc/ssl/nginx/nginx-repo.key > /etc/ssl/nginx/nginx-repo-bundle.crt - ``` - -1. Install the prerequisites: - - ```shell - sudo zypper install curl ca-certificates gpg2 gawk - ``` - -1. To set up the zypper repository for `nginx-agent` packages, run the following command: - - ```shell - sudo zypper addrepo --refresh --check \ - 'https://pkgs.nginx.com/nginx-agent/sles/$releasever_major?ssl_clientcert=/etc/ssl/nginx/nginx-repo-bundle.crt&ssl_verify=peer' nginx-agent - ``` - -1. Next, import an official NGINX signing key so `zypper`/`rpm` can verify the package's authenticity. Fetch the key: - - ```shell - curl -o /tmp/nginx_signing.key https://nginx.org/keys/nginx_signing.key - ``` - -1. Verify that the downloaded file contains the proper key: - - ```shell - gpg --with-fingerprint --dry-run --quiet --no-keyring --import --import-options import-show /tmp/nginx_signing.key - ``` - -1. The output should contain the full fingerprint `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62` as follows: - - ``` - pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] - 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62 - uid nginx signing key - ``` - -1. Finally, import the key to the rpm database: - - ```shell - sudo rpmkeys --import /tmp/nginx_signing.key - ``` - -1. To install `nginx-agent`, run the following command: - - ```shell - sudo zypper install nginx-agent - ``` - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - -### Installing NGINX Agent on Alpine Linux - -1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. - -1. Copy the files to the `/etc/apk/` directory: - - ```shell - sudo cp nginx-repo.key /etc/apk/cert.key - sudo cp nginx-repo.crt /etc/apk/cert.pem - ``` - -1. Install the prerequisites: - - ```shell - sudo apk add openssl curl ca-certificates - ``` - -1. To set up the apk repository for `nginx-agent` packages, run the following command: - - ```shell - printf "%s%s%s\n" \ - "https://pkgs.nginx.com/nginx-agent/alpine/v" \ - `grep -o -E '^[0-9]+\.[0-9]+' /etc/alpine-release` \ - "/main" \ - | sudo tee -a /etc/apk/repositories - ``` - -1. Next, import an official NGINX signing key so apk can verify the package's authenticity. Fetch the key: - - ```shell - curl -o /tmp/nginx_signing.rsa.pub https://nginx.org/keys/nginx_signing.rsa.pub - ``` - -1. Verify that downloaded file contains the proper key: - - ```shell - openssl rsa -pubin -in /tmp/nginx_signing.rsa.pub -text -noout - ``` - - The output should contain the following modulus: - - ``` - Public-Key: (2048 bit) - Modulus: - 00:fe:14:f6:0a:1a:b8:86:19:fe:cd:ab:02:9f:58: - 2f:37:70:15:74:d6:06:9b:81:55:90:99:96:cc:70: - 5c:de:5b:e8:4c:b2:0c:47:5b:a8:a2:98:3d:11:b1: - f6:7d:a0:46:df:24:23:c6:d0:24:52:67:ba:69:ab: - 9a:4a:6a:66:2c:db:e1:09:f1:0d:b2:b0:e1:47:1f: - 0a:46:ac:0d:82:f3:3c:8d:02:ce:08:43:19:d9:64: - 86:c4:4e:07:12:c0:5b:43:ba:7d:17:8a:a3:f0:3d: - 98:32:b9:75:66:f4:f0:1b:2d:94:5b:7c:1c:e6:f3: - 04:7f:dd:25:b2:82:a6:41:04:b7:50:93:94:c4:7c: - 34:7e:12:7c:bf:33:54:55:47:8c:42:94:40:8e:34: - 5f:54:04:1d:9e:8c:57:48:d4:b0:f8:e4:03:db:3f: - 68:6c:37:fa:62:14:1c:94:d6:de:f2:2b:68:29:17: - 24:6d:f7:b5:b3:18:79:fd:31:5e:7f:4c:be:c0:99: - 13:cc:e2:97:2b:dc:96:9c:9a:d0:a7:c5:77:82:67: - c9:cb:a9:e7:68:4a:e1:c5:ba:1c:32:0e:79:40:6e: - ef:08:d7:a3:b9:5d:1a:df:ce:1a:c7:44:91:4c:d4: - 99:c8:88:69:b3:66:2e:b3:06:f1:f4:22:d7:f2:5f: - ab:6d - Exponent: 65537 (0x10001) - ``` - -1. Finally, move the key to apk trusted keys storage: - - ```shell - sudo mv /tmp/nginx_signing.rsa.pub /etc/apk/keys/ - ``` - -1. To install `nginx-agent`, run the following command: - - ```shell - sudo apk add nginx-agent - ``` - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - -### Installing NGINX Agent on Amazon Linux - -1. Create the `/etc/ssl/nginx` directory: - - ```shell - sudo mkdir -p /etc/ssl/nginx - ``` - -1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. - -1. Copy the `nginx-repo.crt` and `nginx-repo.key` files to the `/etc/ssl/nginx/` directory: - - ```shell - sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ - ``` - -1. Install the prerequisites: - - ```shell - sudo yum install yum-utils procps ca-certificates - ``` - -1. To set up the yum repository for Amazon Linux 2, create the file named `/etc/yum.repos.d/nginx-agent.repo` with the following contents: - - ``` - [nginx-agent] - name=nginx-agent repo - baseurl=https://pkgs.nginx.com/nginx-agent/amzn2/$releasever/$basearch - sslclientcert=/etc/ssl/nginx/nginx-repo.crt - sslclientkey=/etc/ssl/nginx/nginx-repo.key - gpgcheck=0 - enabled=1 - ``` - -1. To install `nginx-agent`, run the following command: - - ```shell - sudo yum install nginx-agent - ``` - -1. When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` - -### Installing NGINX Agent on FreeBSD - -1. Create the `/etc/ssl/nginx` directory: - - ```shell - sudo mkdir -p /etc/ssl/nginx - ``` - -1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. - -1. Copy the files to the `/etc/ssl/nginx/` directory: - - ```shell - sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ - ``` - -1. Install the prerequisite `ca_root_nss` package: - - ```shell - sudo pkg install ca_root_nss - ``` - -1. To setup the pkg repository create the file named `/etc/pkg/nginx-agent.conf` with the following content: - - ``` - nginx-agent: { - URL: pkg+https://pkgs.nginx.com/nginx-agent/freebsd/${ABI}/latest - ENABLED: yes - MIRROR_TYPE: SRV - } - ``` - -1. Add the following lines to the `/usr/local/etc/pkg.conf` file: - - ``` - PKG_ENV: { SSL_NO_VERIFY_PEER: "1", - SSL_CLIENT_CERT_FILE: "/etc/ssl/nginx/nginx-repo.crt", - SSL_CLIENT_KEY_FILE: "/etc/ssl/nginx/nginx-repo.key" } - ``` - -1. To install `nginx-agent`, run the following command: - - ```shell - sudo pkg install nginx-agent - ``` - -1. Verify the installation: - - ```shell - sudo nginx-agent -v - ``` diff --git a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/uninstall.md b/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/uninstall.md deleted file mode 100644 index c5076775a6..0000000000 --- a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/uninstall.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: "Uninstall NGINX Agent Package" -draft: false -weight: 700 -toc: true -tags: [ "docs" ] -docs: "DOCS-1230" -categories: ["configuration"] -doctypes: ["task"] ---- - -## Overview - -Learn how to uninstall NGINX Agent from your system. - -## Prerequisites - -- NGINX Agent installed [NGINX Agent installed](../installation-oss) -- The user following these steps will need `root` privilege - -## Uninstalling NGINX Agent -Complete the following steps on each host where you’ve installed NGINX Agent - - -- [Uninstalling NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux](#uninstalling-nginx-agent-on-rhel-centos-rocky-linux-almalinux-and-oracle-linux) -- [Uninstalling NGINX Agent on Ubuntu](#uninstalling-nginx-agent-on-ubuntu) -- [Uninstalling NGINX Agent on Debian](#uninstalling-nginx-agent-on-debian) -- [Uninstalling NGINX Agent on SLES](#uninstalling-nginx-agent-on-sles) -- [Uninstalling NGINX Agent on Alpine Linux](#uninstalling-nginx-agent-on-alpine-linux) -- [Uninstalling NGINX Agent on Amazon Linux](#uninstalling-nginx-agent-on-amazon-linux) -- [Uninstalling NGINX Agent on FreeBSD](#uninstalling-nginx-agent-on-freebsd) - -### Uninstalling NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux - -Complete the following steps on each host where you've installed NGINX Agent: - -1. Stop NGINX Agent: - - ```bash - sudo systemctl stop nginx-agent - ``` - -2. To uninstall NGINX Agent, run the following command: - - ```bash - sudo yum remove nginx-agent - ``` - -### Uninstalling NGINX Agent on Ubuntu - -Complete the following steps on each host where you've installed NGINX Agent: - -1. Stop NGINX Agent: - - ```bash - sudo systemctl stop nginx-agent - ``` - -2. To uninstall NGINX Agent, run the following command: - - ```bash - sudo apt-get remove nginx-agent - ``` - - > **Note:** The `apt-get remove ` command will remove the package from your system, while keeping the associated configuration files for possible future use. If you want to completely remove the package and all of its configuration files, you should use `apt-get purge `. - -### Uninstalling NGINX Agent on Debian - -Complete the following steps on each host where you've installed NGINX Agent: - -1. Stop NGINX Agent: - - ```bash - sudo systemctl stop nginx-agent - ``` - -2. To uninstall NGINX Agent, run the following command: - - ```bash - sudo apt-get remove nginx-agent - ``` - - > **Note:** The `apt-get remove ` command will remove the package from your system, while keeping the associated configuration files for possible future use. If you want to completely remove the package and all of its configuration files, you should use `apt-get purge `. - -### Uninstalling NGINX Agent on SLES - -Complete the following steps on each host where you've installed NGINX Agent: - -1. Stop NGINX agent: - - ```bash - sudo systemctl stop nginx-agent - ``` - -2. To uninstall NGINX agent, run the following command: - - ```bash - sudo zypper remove nginx-agent - ``` - -### Uninstalling NGINX Agent on Alpine Linux - -Complete the following steps on each host where you've installed NGINX agent: - -1. Stop NGINX agent: - - ```bash - sudo rc-service nginx-agent stop - ``` - -2. To uninstall NGINX agent, run the following command: - - ```bash - sudo apk del nginx-agent - ``` - -### Uninstalling NGINX Agent on Amazon Linux - -Complete the following steps on each host where you've installed NGINX agent: - -1. Stop NGINX agent: - - ```bash - sudo systemctl stop nginx-agent - ``` - -2. To uninstall NGINX agent, run the following command: - - ```bash - sudo yum remove nginx-agent - ``` - -### Uninstalling NGINX Agent on FreeBSD - -Complete the following steps on each host where you've installed NGINX agent: - -1. Stop NGINX agent: - - ```bash - sudo service nginx-agent stop - ``` - -2. To uninstall NGINX agent, run the following command: - - ```bash - sudo pkg delete nginx-agent - ``` diff --git a/site/content/previous-versions/_index.md b/site/content/previous-versions/_index.md deleted file mode 100644 index 8e47a7385c..0000000000 --- a/site/content/previous-versions/_index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Previous Versions" -description: "Documentation for previous versions of NGINX Agent." -linkTitle: "Previous Versions" -weight: 10000 ---- \ No newline at end of file diff --git a/site/content/support.md b/site/content/support.md new file mode 100644 index 0000000000..0c7fff1bfe --- /dev/null +++ b/site/content/support.md @@ -0,0 +1,15 @@ +--- +title: Support +weight: 800 +docs: DOCS-000 +--- + +## Support policy +F5 NGINX Agent adheres to the support policy detailed in the following knowledge base article: [K000140156](https://my.f5.com/manage/s/article/K000140156). + +## Contact F5 Support +For questions and/or assistance with installing, troubleshooting, or using NGINX Agent, contact Support via the [MyF5 Customer Portal](https://account.f5.com/myf5). + +## Community support +- If you experience issues with NGINX Agent, please [open an issue in GitHub](https://github.com/nginx/agent/issues/new). +- If you have any suggestions or feature requests, please [open an idea in GitHub discussions](https://github.com/nginx/agent/discussions). \ No newline at end of file diff --git a/site/content/technical-specifications.md b/site/content/technical-specifications.md index 6f9a72b091..fac11fbdc0 100644 --- a/site/content/technical-specifications.md +++ b/site/content/technical-specifications.md @@ -1,18 +1,15 @@ --- title: "Technical specifications" -draft: false -weight: 200 toc: true -tags: [ "docs" ] -categories: ["development"] -doctypes: ["task"] +weight: 200 +docs: DOCS-000 --- ## Overview -This document provides technical specifications for NGINX Agent. It includes information on supported distributions, deployment environments, NGINX versions, sizing recommendations, and logging. +This document provides technical specifications for F5 NGINX Agent. It includes information on supported distributions, deployment environments, NGINX versions, sizing recommendations, and logging. -## Supported Distributions +## Supported distributions NGINX Agent can run in most environments. We support the following distributions: @@ -31,7 +28,7 @@ NGINX Agent can run in most environments. We support the following distributions {{< /bootstrap-table >}} -## Supported Deployment Environments +## Supported deployment environments NGINX Agent can be deployed in the following environments: @@ -40,12 +37,12 @@ NGINX Agent can be deployed in the following environments: - Public Cloud: AWS, Google Cloud Platform, and Microsoft Azure - Virtual Machine -## Supported NGINX Versions +## Supported NGINX versions NGINX Agent works with all supported versions of NGINX Open Source and NGINX Plus. -## Sizing Recommendations +## Sizing recommendations Minimum system sizing recommendations for NGINX Agent: {{< bootstrap-table "table table-striped table-bordered" >}} @@ -56,4 +53,8 @@ Minimum system sizing recommendations for NGINX Agent: ## Logging -NGINX Agent utilizes log files and formats to collect metrics. Increasing the log formats and instance counts will result in increased log file sizes. To prevent system storage issues due to a growing log directory, it is recommended to add a separate partition for `/var/log/nginx-agent` and enable [log rotation](http://nginx.org/en/docs/control.html#logs). \ No newline at end of file +NGINX Agent utilizes log files and formats to collect metrics. Increasing the log formats and instance counts will result in increased log file sizes. + +To prevent system storage issues due to a growing log directory, it is recommended to add a separate partition for `/var/log/nginx-agent` and enable [log rotation](http://nginx.org/en/docs/control.html#logs). + +More information is available in the [Configuration overview]({{< ref "/how-to/configuration-overview.md#logs" >}}) \ No newline at end of file diff --git a/site/content/previous-versions/NGINX-agent-v2/_index.md b/site/content/v2/_index.md similarity index 72% rename from site/content/previous-versions/NGINX-agent-v2/_index.md rename to site/content/v2/_index.md index 979f7a4c74..f0138d948b 100644 --- a/site/content/previous-versions/NGINX-agent-v2/_index.md +++ b/site/content/v2/_index.md @@ -1,6 +1,7 @@ --- title: "NGINX Agent v2" description: "NGINX Agent is a companion daemon for your NGINX Open Source or NGINX Plus instance." -linkTitle: "NGINX Agent" -menu: docs +weight: 900 +cascade: + type: agent-v2-migration --- \ No newline at end of file diff --git a/site/content/v2/changelog.md b/site/content/v2/changelog.md new file mode 100644 index 0000000000..981348f9e3 --- /dev/null +++ b/site/content/v2/changelog.md @@ -0,0 +1,282 @@ +--- +title: "Changelog" +weight: 1200 +toc: true +docs: "DOCS-1093" +--- + +{{< note >}}You can find the full changelog, contributor list and assets for NGINX Agent in the [GitHub repository](https://github.com/nginx/agent/releases).{{< /note >}} + +See the list of supported Operating Systems and architectures in the [Technical Specifications]({{< relref "./technical-specifications.md" >}}). + +--- +## Release [v2.39.0](https://github.com/nginx/agent/releases/tag/v2.39.0) + +### 🌟 Highlights + +- Remove official docker images & move testing images to test folder by [@aphralG](https://github.com/aphralG) in [#838](https://github.com/nginx/agent/pull/838) + +### 🐛 Bug Fixes + +In this release we have resolved the following issues: + +- Race conditions fixes by [@oliveromahony](https://github.com/oliveromahony) in [#810](https://github.com/nginx/agent/pull/810) +- fix r30 pipeline failures by [@oliveromahony](https://github.com/oliveromahony) in [#844](https://github.com/nginx/agent/pull/844) +- Fixed make target pointing at wrong Dockerfile and renamed others to be consistent by [@oliveromahony](https://github.com/oliveromahony) in [#857](https://github.com/nginx/agent/pull/857) +- Fix broken links causing deployment failures by [@ADubhlaoich](https://github.com/ADubhlaoich) in [#863](https://github.com/nginx/agent/pull/863) +- Fix NGINX OSS integration tests by [@dhurley](https://github.com/dhurley) in [#888](https://github.com/nginx/agent/pull/888) +- Fix docs docker failing without git context by [@nginx-jack](https://github.com/nginx-jack) in [#892](https://github.com/nginx/agent/pull/892) + +### 📝 Documentation + +We have made the following updates to the documentation: + +- Add automatic changelog generation in release workflow by [@spencerugbo](https://github.com/spencerugbo) in [#784](https://github.com/nginx/agent/pull/784) +- Add CLA bot workflow by [@lucacome](https://github.com/lucacome) in [#828](https://github.com/nginx/agent/pull/828) +- Refactor docker images by [@nginx-seanmoloney](https://github.com/nginx-seanmoloney) in [#841](https://github.com/nginx/agent/pull/841) +- Docs: Add hugo version check and theme update to Makefile by [@nginx-jack](https://github.com/nginx-jack) in [#869](https://github.com/nginx/agent/pull/869) +- Change casing of docs makefile to Makefile by [@nginx-jack](https://github.com/nginx-jack) in [#884](https://github.com/nginx/agent/pull/884) +- docs: enableGitInfo config and docs-action bump by [@nginx-jack](https://github.com/nginx-jack) in [#886](https://github.com/nginx/agent/pull/886) +- Change go version to latest go 1.23.2 by [@oliveromahony](https://github.com/oliveromahony) in [#889](https://github.com/nginx/agent/pull/889) +- Remove link to github dockerfiles by [@nginx-seanmoloney](https://github.com/nginx-seanmoloney) in [#897](https://github.com/nginx/agent/pull/897) +- Docs: Update link to 3rd party site by [@nginx-aoife](https://github.com/nginx-aoife) in [#898](https://github.com/nginx/agent/pull/898) +- Update the changelog for v2.38 by [@ADubhlaoich](https://github.com/ADubhlaoich) in [#901](https://github.com/nginx/agent/pull/901) + +### 🔨 Maintenance + +We have made the following maintenance-related minor changes: + +- Set log level to debug for inetegration tests by [@aphralG](https://github.com/aphralG) in [#826](https://github.com/nginx/agent/pull/826) +- updated runc dependency highlighted in security scan scan by [@oliveromahony](https://github.com/oliveromahony) in [#842](https://github.com/nginx/agent/pull/842) +- Update CODEOWNERS by [@oCHRISo](https://github.com/oCHRISo) in [#851](https://github.com/nginx/agent/pull/851) +- Check version command output by [@aphralG](https://github.com/aphralG) in [#853](https://github.com/nginx/agent/pull/853) +- Bump NGINX plus go client version from v1 to v2 by [@dhurley](https://github.com/dhurley) in [#879](https://github.com/nginx/agent/pull/879) +- Allowlist Error Messages by [@aphralG](https://github.com/aphralG) in [#907](https://github.com/nginx/agent/pull/907) + +--- +## Release [v2.38.0](https://github.com/nginx/agent/releases/tag/v2.38.0) + +### 🐛 Bug Fixes + +In this release we have resolved the following issues: + +- Fix broken URLS in docs by [@nginx-aoife](https://github.com/nginx-aoife) in [#796](https://github.com/nginx/agent/pull/796) +- fix name of deprecated flag by [@aphralG](https://github.com/aphralG) in [#811](https://github.com/nginx/agent/pull/811) +- Fix make image targets by [@dhurley](https://github.com/dhurley) in [#812](https://github.com/nginx/agent/pull/812) +- Fix debian oss image by [@dhurley](https://github.com/dhurley) in [#819](https://github.com/nginx/agent/pull/819) + +### 📝 Documentation + +We have made the following updates to the documentation: + +- docs: update GPG keys by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#776](https://github.com/nginx/agent/pull/776) +- Add new docker images to v2 pipeline for integration testing by [@oliveromahony](https://github.com/oliveromahony) in [#756](https://github.com/nginx/agent/pull/756) +- Update website changelog for v2.37.0 by [@ADubhlaoich](https://github.com/ADubhlaoich) in [#790](https://github.com/nginx/agent/pull/790) +- Pass on custom error log path at the time of validating config by [@achawla2012](https://github.com/achawla2012) in [#774](https://github.com/nginx/agent/pull/774) +- Remove blocking calls in metrics framework by [@oliveromahony](https://github.com/oliveromahony) in [#788](https://github.com/nginx/agent/pull/788) +- Update broken URL in installation-plus.md by [@nginx-aoife](https://github.com/nginx-aoife) in [#808](https://github.com/nginx/agent/pull/808) + +### 🔨 Maintenance + +We have made the following maintenance-related minor changes: + +- add new plus docker images to v2 pipeline by [@aphralG](https://github.com/aphralG) in [#779](https://github.com/nginx/agent/pull/779) +- Add MaxRecvMsgSize and MaxSendMsgSize to client and server options by [@oliveromahony](https://github.com/oliveromahony) in [#795](https://github.com/nginx/agent/pull/795) +- added leak tests for agent v2 by [@oliveromahony](https://github.com/oliveromahony) in [#807](https://github.com/nginx/agent/pull/807) + +--- +## Release [v2.37.0](https://github.com/nginx/agent/releases/tag/v2.37.0) + +### 🚀 Features + +This release introduces the following new features: + +- feat: Update the changelog by [@ADubhlaoich](https://github.com/ADubhlaoich) in [#753](https://github.com/nginx/agent/pull/753) + +### 🐛 Bug Fixes + +In this release we have resolved the following issues: + +- Prevent writing outside allowed directories list from a config payload with actions by [@oliveromahony](https://github.com/oliveromahony) in [#766](https://github.com/nginx/agent/pull/766) +- The letter v is now always prepended to output of -v by [@olli-holmala](https://github.com/olli-holmala) in [#751](https://github.com/nginx/agent/pull/751) +- Fix backoff to drop Metrics Reports from buffer after max_elapsed_time has been reached by [@oliveromahony](https://github.com/oliveromahony) in [#752](https://github.com/nginx/agent/pull/752) +- Fix Post Install Script Issues by [@spencerugbo](https://github.com/spencerugbo) in [#739](https://github.com/nginx/agent/pull/739) +- docs: fix github links in changelog by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#770](https://github.com/nginx/agent/pull/770) +- Fix post install script for when no nginx instance is installed by [@dhurley](https://github.com/dhurley) in [#773](https://github.com/nginx/agent/pull/773) + +### 📝 Documentation + +We have made the following updates to the documentation: + +- Upgrade prometheus exporter version to latest by [@oliveromahony](https://github.com/oliveromahony) in [#749](https://github.com/nginx/agent/pull/749) +- Add badges for Go version, release, license, contributions, and Slack… by [@oCHRISo](https://github.com/oCHRISo) in [#763](https://github.com/nginx/agent/pull/763) +- Add instructions for Amazon Linux 2023 by [@nginx-seanmoloney](https://github.com/nginx-seanmoloney) in [#759](https://github.com/nginx/agent/pull/759) +- Add docs-build-push github workflow by [@nginx-jack](https://github.com/nginx-jack) in [#765](https://github.com/nginx/agent/pull/765) + +### 🔨 Maintenance + +We have made the following maintenance-related minor changes: + +- Increase timeout period for collecting metrics by [@oliveromahony](https://github.com/oliveromahony) in [#755](https://github.com/nginx/agent/pull/755) + +--- +## Release [v2.36.1](https://github.com/nginx/agent/releases/tag/v2.36.1) + +### 🌟 Highlights + +- Upgrade crossplane version to prevent Agent from rolling back in the case of valid NGINX configurations by [@oliveromahony](https://github.com/oliveromahony) in [#746](https://github.com/nginx/agent/pull/746) + +### 🔨 Maintenance + +We have made the following maintenance-related minor changes: + +- Added version regex to parse the logs to see if matches vsemvar format by [@oliveromahony](https://github.com/oliveromahony) in [#747](https://github.com/nginx/agent/pull/747) + +--- +## Release [v2.36.0](https://github.com/nginx/agent/releases/tag/v2.36.0) + +### 🐛 Bug Fixes + +In this release we have resolved the following issues: + +- Fix incorrect bold tag in heading by [@nginx-seanmoloney](https://github.com/nginx-seanmoloney) in [#715](https://github.com/nginx/agent/pull/715) +- URL fix for building docker image in README.md by [@y82](https://github.com/y82) in [#720](https://github.com/nginx/agent/pull/720) +- Fix for version by [@oliveromahony](https://github.com/oliveromahony) in [#732](https://github.com/nginx/agent/pull/732) + +### 📝 Documentation + +We have made the following updates to the documentation: + +- More flexible container images for the official images by [@oliveromahony](https://github.com/oliveromahony) in [#729](https://github.com/nginx/agent/pull/729) +- Update configuration examples by [@nginx-seanmoloney](https://github.com/nginx-seanmoloney) in [#731](https://github.com/nginx/agent/pull/731) +- updated github.com/rs/cors version by [@oliveromahony](https://github.com/oliveromahony) in [#735](https://github.com/nginx/agent/pull/735) +- docs: update changelog by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#736](https://github.com/nginx/agent/pull/736) +- Upgrade crossplane by [@oliveromahony](https://github.com/oliveromahony) in [#737](https://github.com/nginx/agent/pull/737) + +--- +## Release [v2.35.1](https://github.com/nginx/agent/releases/tag/v2.35.1) + +### 🐛 Bug Fixes + +In this release we have resolved the following issues: + +- fix: add deduplication for the same ssl cert metadata by [@mattdesmarais](https://github.com/mattdesmarais) [@oliveromahony](https://github.com/oliveromahony) in [#716](https://github.com/nginx/agent/pull/716) +- Fix release workflow by [@dhurley](https://github.com/dhurley) in [#724](https://github.com/nginx/agent/pull/724) + +### 📝 Documentation + +We have made the following updates to the documentation: + +- Update environment variables from NMS to NGINX_AGENT by [@spencerugbo](https://github.com/spencerugbo) in [#710](https://github.com/nginx/agent/pull/710) +- Update the flag & environment table callouts by [@ADubhlaoich](https://github.com/ADubhlaoich) in [#712](https://github.com/nginx/agent/pull/712) +- updated golang version to 1.22 by [@oliveromahony](https://github.com/oliveromahony) in [#717](https://github.com/nginx/agent/pull/717) + +### 🔨 Maintenance + +We have made the following maintenance-related minor changes: + +- More detailed test for env variables migration by [@oliveromahony](https://github.com/oliveromahony) in [#709](https://github.com/nginx/agent/pull/709) + +--- +## Release [v2.35.0](https://github.com/nginx/agent/releases/tag/v2.35.0) + +### 🌟 Highlights + +- R32 operating system support parity by [@oliveromahony](https://github.com/oliveromahony) in [#708](https://github.com/nginx/agent/pull/708) + +### 🐛 Bug Fixes + +In this release we have resolved the following issues: + +- Change environment prefix from nms to nginx_agent by [@spencerugbo](https://github.com/spencerugbo) in [#706](https://github.com/nginx/agent/pull/706) + +### 📝 Documentation + +We have made the following updates to the documentation: + +- Consolidated CLI flag and Env Var sections by [@travisamartin](https://github.com/travisamartin) in [#701](https://github.com/nginx/agent/pull/701) +- Add Ubuntu Noble 24.04 LTS support by [@Dean-Coakley](https://github.com/Dean-Coakley) in [#682](https://github.com/nginx/agent/pull/682) + +--- +## Release [v2.34.1](https://github.com/nginx/agent/releases/tag/v2.34.1) + +### 🐛 Bug Fixes + +In this release we have resolved the following issues: + +- Fix metrics reporter retry logic by [@dhurley](https://github.com/dhurley) in [#700](https://github.com/nginx/agent/pull/700) + +### 📝 Documentation + +We have made the following updates to the documentation: + +- Update changelog for release 2.34 by [@ADubhlaoich](https://github.com/ADubhlaoich) in [#693](https://github.com/nginx/agent/pull/693) + +--- +## Release [v2.34.0](https://github.com/nginx/agent/releases/tag/v2.34.0) + +### 🌟 Highlights + +- Bump the version of net package in golang by [@oliveromahony](https://github.com/oliveromahony) in [#645](https://github.com/nginx/agent/pull/645) + +- Add health check endpoint by [@dhurley](https://github.com/dhurley) in [#665](https://github.com/nginx/agent/pull/665) + +- Add pending health status by [@dhurley](https://github.com/dhurley) in [#672](https://github.com/nginx/agent/pull/672) + +### 🐛 Bug Fixes + +In this release we have resolved the following issues: + +- fix: fix titles case by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#674](https://github.com/nginx/agent/pull/674) +- Fix oracle linux integration test by [@dhurley](https://github.com/dhurley) in [#676](https://github.com/nginx/agent/pull/676) + +### 📝 Documentation + +We have made the following updates to the documentation: + +- chore: add 2.33.0 changelog by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#622](https://github.com/nginx/agent/pull/622) +- Change environment variable list to table with CLI references by [@ADubhlaoich](https://github.com/ADubhlaoich) in [#689](https://github.com/nginx/agent/pull/689) +- Add health checks documentation by [@dhurley](https://github.com/dhurley) in [#673](https://github.com/nginx/agent/pull/673) + +### 🔨 Maintenance + +We have made the following maintenance-related minor changes: + +- Keep looking for master process by [@spencerugbo](https://github.com/spencerugbo) in [#617](https://github.com/nginx/agent/pull/617) +- Bump docker dependency to version v24.0.9 by [@dhurley](https://github.com/dhurley) in [#626](https://github.com/nginx/agent/pull/626) +- Bump the version of github.com/opencontainers/runc dependency by [@dhurley](https://github.com/dhurley) in [#657](https://github.com/nginx/agent/pull/657) +- Remove unnecessary freebsd logic for finding process executable by [@dhurley](https://github.com/dhurley) in [#668](https://github.com/nginx/agent/pull/668) +- Add additional checks in chunking functionality by [@dhurley](https://github.com/dhurley) in [#671](https://github.com/nginx/agent/pull/671) + +--- +## Release [v2.33.0](https://github.com/nginx/agent/releases/tag/v2.33.0) + +### 🚀 Features + +This release introduces the following new features: + +- feat: Add Support for NAP 5 by [@edarzins](https://github.com/edarzins) in [#604](https://github.com/nginx/agent/pull/604) + +### 🐛 Bug Fixes + +In this release we have resolved the following issues: + +- Fix nfpm.yaml for apk packages by [@dhurley](https://github.com/dhurley) in [#597](https://github.com/nginx/agent/pull/597) +- fix unit test by [@oliveromahony](https://github.com/oliveromahony) in [#607](https://github.com/nginx/agent/pull/607) +- Fix user workflow performance tests by [@dhurley](https://github.com/dhurley) in [#612](https://github.com/nginx/agent/pull/612) +- fix Advanced Metrics by [@aphralG](https://github.com/aphralG) in [#598](https://github.com/nginx/agent/pull/598) + +### 📝 Documentation + +We have made the following updates to the documentation: + +- chore: Add the 2.32.2 Changelog to the docs website by [@Jcahilltorre](https://github.com/Jcahilltorre) in [#601](https://github.com/nginx/agent/pull/601) + +### 🔨 Maintenance + +We have made the following maintenance-related minor changes: + +- Bump the version of protobuf by [@oliveromahony](https://github.com/oliveromahony) in [#602](https://github.com/nginx/agent/pull/602) +- replace duplicate isContainer call by [@oliveromahony](https://github.com/oliveromahony) in [#596](https://github.com/nginx/agent/pull/596) +- Add logging to NGINX API http requests by [@dhurley](https://github.com/dhurley) in [#605](https://github.com/nginx/agent/pull/605) + diff --git a/site/content/v2/configuration/_index.md b/site/content/v2/configuration/_index.md new file mode 100644 index 0000000000..cd9db7e495 --- /dev/null +++ b/site/content/v2/configuration/_index.md @@ -0,0 +1,6 @@ +--- +title: "Configuration" +weight: "400" +--- + +Learn how to configure NGINX Agent. \ No newline at end of file diff --git a/site/content/v2/configuration/configuration-overview.md b/site/content/v2/configuration/configuration-overview.md new file mode 100644 index 0000000000..b5bdd2ef06 --- /dev/null +++ b/site/content/v2/configuration/configuration-overview.md @@ -0,0 +1,274 @@ +--- +title: "How to configure NGINX Agent" +draft: false +weight: 100 +toc: true +tags: [ "docs" ] +docs: "DOCS-1229" +categories: ["configuration"] +doctypes: ["task"] +--- + +The following sections explain how to configure NGINX Agent using configuration files, CLI flags, and environment variables. + +{{}} + +- NGINX Agent interprets configuration values set by configuration files, CLI flags, and environment variables in the following priorities: + + 1. CLI flags overwrite configuration files and environment variable values. + 2. Environment variables overwrite configuration file values. + 3. Config files are the lowest priority and config settings are superseded if either of the other options is used. + +- You must open any required firewall ports or add SELinux/AppArmor rules for the ports and IPs you want to use. + +{{}} + +## Configure with Config Files + +The default locations of configuration files for NGINX Agent are `/etc/nginx-agent/nginx-agent.conf` and `/var/lib/nginx-agent/agent-dynamic.conf`. The `agent-dynamic.conf` file default location is different for FreeBSD which is located `/var/db/nginx-agent/agent-dynamic.conf`. These files have comments at the top indicating their purpose. + +Examples of the configuration files are provided below: + +
+ example nginx-agent.conf + +{{}} +In the following example `nginx-agent.conf` file, you can change the `server.host` and `server.grpcPort` to connect to the control plane. +{{}} + +```nginx {hl_lines=[13]} +# +# /etc/nginx-agent/nginx-agent.conf +# +# Configuration file for NGINX Agent. +# +# This file tracks agent configuration values that are meant to be statically set. There +# are additional NGINX Agent configuration values that are set via the API and agent install script +# which can be found in /etc/nginx-agent/agent-dynamic.conf. + +# specify the server grpc port to connect to +server: + # host of the control plane + host: + grpcPort: 443 + backoff: # note: default values are prepopulated + initial_interval: 100ms # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour + randomization_factor: 0.10 # Add the appropriate float value here, e.g., 0.10 + multiplier: 1.5 # Add the appropriate float value here, e.g., 1.5 + max_interval: 1m # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour + max_elapsed_time: 0 # Add the appropriate duration value here, e.g., "0" for indefinite "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour +# tls options +tls: + # enable tls in the nginx-agent setup for grpcs + # default to enable to connect with secure connection but without client cert for mtls + enable: true + # controls whether the server certificate chain and host name are verified. + # for production use, see instructions for configuring TLS + skip_verify: false +log: + # set log level (panic, fatal, error, info, debug, trace; default "info") + level: info + # set log path. if empty, don't log to file. + path: /var/log/nginx-agent/ +nginx: + # path of NGINX logs to exclude + exclude_logs: "" + # Set to true when NGINX configuration should contain no warnings when performing a configuration apply (nginx -t is used to carry out this check) + treat_warnings_as_errors: false # Default is false +# data plane status message / 'heartbeat' +dataplane: + status: + # poll interval for dataplane status - the frequency the NGINX Agent will query the dataplane for changes + poll_interval: 30s + # report interval for dataplane status - the maximum duration to wait before syncing dataplane information if no updates have been observed + report_interval: 24h +metrics: + # specify the size of a buffer to build before sending metrics + bulk_size: 20 + # specify metrics poll interval + report_interval: 1m + collection_interval: 15s + mode: aggregated + backoff: # note: default values are prepopulated + initial_interval: 100ms # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour + randomization_factor: 0.10 # Add the appropriate float value here, e.g., 0.10 + multiplier: 1.5 # Add the appropriate float value here, e.g., 1.5 + max_interval: 1m # Add the appropriate duration value here, e.g., "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour + max_elapsed_time: 0 # Add the appropriate duration value here, e.g., "0" for indefinite "100ms" for 100 milliseconds, "5s" for 5 seconds, "1m" for 1 minute, "1h" for 1 hour + +# OSS NGINX default config path +# path to aux file dirs can also be added +config_dirs: "/etc/nginx:/usr/local/etc/nginx" + +# Internal queue size +queue_size: 100 + +extensions: + - nginx-app-protect + +# Enable reporting NGINX App Protect details to the control plane. +nginx_app_protect: + # Report interval for NGINX App Protect details - the frequency NGINX Agent checks NGINX App Protect for changes. + report_interval: 15s + # Enable precompiled publication from the NGINX Management Suite (true) or perform compilation on the data plane host (false). + precompiled_publication: true +``` + +
+ + +
+ example dynamic-agent.conf + +{{}} +Default location in Linux environments: `/var/lib/nginx-agent/agent-dynamic.conf` + +Default location in FreeBSD environments: `/var/db/nginx-agent/agent-dynamic.conf` +{{}} + +```yaml +# Dynamic configuration file for NGINX Agent. +# +# The purpose of this file is to track agent configuration +# values that can be dynamically changed via the API and the agent install script. +# You may edit this file, but API calls that modify the tags on this system will +# overwrite the tag values in this file. +# +# The agent configuration values that API calls can modify are as follows: +# tags: +# - dev +# - qa +# +# The agent configuration value that the agent install script can modify are as follows: +# instance_group: my-instance-group + +instance_group: my-instance-group +tags: + - dev + - qa +``` + +
+ +## CLI Flags & Environment Variables + +This section details the CLI flags and corresponding environment variables used to configure the NGINX Agent. + +### Usage + +#### CLI Flags + +```sh +nginx-agent [flags] +``` + +#### Environment Variables + +```sh +export ENV_VARIABLE_NAME="value" +nginx-agent +``` + +### CLI Flags and Environment Variables + +{{< warning >}} + +Before version 2.35.0, the environment variables were prefixed with `NMS_` instead of `NGINX_AGENT_`. + +If you are upgrading from an older version, update your configuration accordingly. + +{{< /warning >}} + +{{}} +| CLI flag | Environment variable | Description | +|---------------------------------------------|--------------------------------------|-----------------------------------------------------------------------------| +| `--api-cert` | `NGINX_AGENT_API_CERT` | Specifies the certificate used by the Agent API. | +| `--api-host` | `NGINX_AGENT_API_HOST` | Sets the host used by the Agent API. Default: *127.0.0.1* | +| `--api-key` | `NGINX_AGENT_API_KEY` | Specifies the key used by the Agent API. | +| `--api-port` | `NGINX_AGENT_API_PORT` | Sets the port for exposing nginx-agent to HTTP traffic. | +| `--config-dirs` | `NGINX_AGENT_CONFIG_DIRS` | Defines directories NGINX Agent can read/write. Default: *"/etc/nginx:/usr/local/etc/nginx:/usr/share/nginx/modules:/etc/nms"* | +| `--dataplane-report-interval` | `NGINX_AGENT_DATAPLANE_REPORT_INTERVAL` | Sets the interval for dataplane reporting. Default: *24h0m0s* | +| `--dataplane-status-poll-interval` | `NGINX_AGENT_DATAPLANE_STATUS_POLL_INTERVAL` | Sets the interval for polling dataplane status. Default: *30s* | +| `--display-name` | `NGINX_AGENT_DISPLAY_NAME` | Sets the instance's display name. | +| `--dynamic-config-path` | `NGINX_AGENT_DYNAMIC_CONFIG_PATH` | Specifies the path of the Agent dynamic config file. Default: *"/var/lib/nginx-agent/agent-dynamic.conf"* | +| `--features` | `NGINX_AGENT_FEATURES` | Specifies a comma-separated list of features enabled for the agent. Default: *[registration, nginx-config-async, nginx-ssl-config, nginx-counting, metrics, dataplane-status, process-watcher, file-watcher, activity-events, agent-api]* | +| `--ignore-directives` | | Specifies a comma-separated list of directives to ignore for sensitive info.| +| `--instance-group` | `NGINX_AGENT_INSTANCE_GROUP` | Sets the instance's group value. | +| `--log-level` | `NGINX_AGENT_LOG_LEVEL` | Sets the logging level (e.g., panic, fatal, error, info, debug, trace). Default: *info* | +| `--log-path` | `NGINX_AGENT_LOG_PATH` | Specifies the path to output log messages. | +| `--metrics-bulk-size` | `NGINX_AGENT_METRICS_BULK_SIZE` | Specifies the number of metrics reports collected before sending data. Default: *20* | +| `--metrics-collection-interval` | `NGINX_AGENT_METRICS_COLLECTION_INTERVAL` | Sets the interval for metrics collection. Default: *15s* | +| `--metrics-mode` | `NGINX_AGENT_METRICS_MODE` | Sets the metrics collection mode: streaming or aggregation. Default: *aggregated* | +| `--metrics-report-interval` | `NGINX_AGENT_METRICS_REPORT_INTERVAL` | Sets the interval for reporting collected metrics. Default: *1m0s* | +| `--nginx-config-reload-monitoring-period` | | Sets the duration to monitor error logs after an NGINX reload. Default: *10s* | +| `--nginx-exclude-logs` | `NGINX_AGENT_NGINX_EXCLUDE_LOGS` | Specifies paths of NGINX access logs to exclude from metrics collection. | +| `--nginx-socket` | `NGINX_AGENT_NGINX_SOCKET` | Specifies the location of the NGINX Plus counting Unix socket. Default: *unix:/var/run/nginx-agent/nginx.sock* | +| `--nginx-treat-warnings-as-errors` | `NGINX_AGENT_NGINX_TREAT_WARNINGS_AS_ERRORS` | Treats warnings as failures on configuration application. | +| `--queue-size` | `NGINX_AGENT_QUEUE_SIZE` | Specifies the size of the NGINX Agent internal queue. | +| `--server-command` | | Specifies the name of the command server sent in the TLS configuration. | +| `--server-grpcport` | `NGINX_AGENT_SERVER_GRPCPORT` | Sets the desired GRPC port for NGINX Agent traffic. | +| `--server-host` | `NGINX_AGENT_SERVER_HOST` | Specifies the IP address of the server host. | +| `--server-metrics` | | Specifies the name of the metrics server sent in the TLS configuration. | +| `--server-token` | `NGINX_AGENT_SERVER_TOKEN` | Sets the authentication token for accessing the commander and metrics services. Default: *e202f883-54c6-4702-be15-3ba6e507879a* | +| `--tags` | `NGINX_AGENT_TAGS` | Specifies a comma-separated list of tags for the instance or machine. | +| `--tls-ca` | `NGINX_AGENT_TLS_CA` | Specifies the path to the CA certificate file for TLS. | +| `--tls-cert` | `NGINX_AGENT_TLS_CERT` | Specifies the path to the certificate file for TLS. | +| `--tls-enable` | `NGINX_AGENT_TLS_ENABLE` | Enables TLS for secure communications. | +| `--tls-key` | `NGINX_AGENT_TLS_KEY` | Specifies the path to the certificate key file for TLS. | +| `--tls-skip-verify` | `NGINX_AGENT_TLS_SKIP_VERIFY` | Insecurely skips verification for gRPC TLS credentials. | +{{}} + +
+ +{{}} +Use the `--config-dirs` command-line option, or the `config_dirs` key in the `nginx-agent.conf` file, to identify the directories NGINX Agent can read from or write to. This setting also defines the location to which you can upload config files when using a control plane. + +NGINX Agent cannot write to directories outside the specified location when updating a config and cannot upload files to directories outside of the configured location. + +NGINX Agent follows NGINX configuration directives to file paths outside the designated directories and reads certificates' metadata. NGINX Agent uses the following directives: + +- [`ssl_certificate`](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate) + +{{}} + +{{}} Use the `--dynamic-config-path` command-line option to set the location of the dynamic config file. This setting also requires you to move your dynamic config to the new path, or create a new dynamic config file at the specified location. + +Default location in Linux environments: `/var/lib/nginx-agent/agent-dynamic.conf` + +Default location in FreeBSD environments: `/var/db/nginx-agent/agent-dynamic.conf` + +{{}} + +## Log Rotation + +By default, NGINX Agent rotates logs daily using logrotate with the following configuration: + +
+ NGINX Agent Logrotate Configuration + +``` yaml +/var/log/nginx-agent/*.log +{ + # log files are rotated every day + daily + # log files are rotated if they grow bigger than 5M + size 5M + # truncate the original log file after creating a copy + copytruncate + # remove rotated logs older than 10 days + maxage 10 + # log files are rotated 10 times before being removed + rotate 10 + # old log files are compressed + compress + # if the log file is missing it will go on to the next one without issuing an error message + missingok + # do not rotate the log if it is empty + notifempty +} +``` +
+ +If you need to change the default configuration, update the file at `/etc/logrotate.d/nginx-agent`. + +For more details on logrotate configuration, see [Logrotate Configuration Options](https://linux.die.net/man/8/logrotate). \ No newline at end of file diff --git a/site/content/previous-versions/NGINX-agent-v2/configuration/configure-nginx-agent-group.md b/site/content/v2/configuration/configure-nginx-agent-group.md similarity index 98% rename from site/content/previous-versions/NGINX-agent-v2/configuration/configure-nginx-agent-group.md rename to site/content/v2/configuration/configure-nginx-agent-group.md index 43cd80bde1..45c3e9094c 100644 --- a/site/content/previous-versions/NGINX-agent-v2/configuration/configure-nginx-agent-group.md +++ b/site/content/v2/configuration/configure-nginx-agent-group.md @@ -1,5 +1,5 @@ --- -title: "Add NGINX Users to nginx-agent Group" +title: "Add NGINX users to nginx-agent group" draft: false weight: 300 toc: true diff --git a/site/content/previous-versions/NGINX-agent-v2/configuration/encrypt-communication.md b/site/content/v2/configuration/encrypt-communication.md similarity index 83% rename from site/content/previous-versions/NGINX-agent-v2/configuration/encrypt-communication.md rename to site/content/v2/configuration/encrypt-communication.md index 26d0b015f0..7d9f1b5472 100644 --- a/site/content/previous-versions/NGINX-agent-v2/configuration/encrypt-communication.md +++ b/site/content/v2/configuration/encrypt-communication.md @@ -1,5 +1,5 @@ --- -title: Encrypt Communication +title: Encrypt communication tags: - docs toc: true @@ -13,7 +13,7 @@ Follow the steps in this guide to encrypt communication between NGINX Agent and ## Before You Begin -To enable mTLS, you must have TLS enabled and supply a key, cert, and a CA cert on both the client and server. TSee the [Secure Traffic with Certificates](https://docs.nginx.com/nginx-management-suite/admin-guides/configuration/secure-traffic/) topic for instructions on how to generate keys and set them in the specific values in the NGINX Agent configuration. +To enable mTLS, you must have TLS enabled and supply a key, cert, and a CA cert on both the client and server. See the [Secure Traffic with Certificates](https://docs.nginx.com/nginx-instance-manager/system-configuration/secure-traffic/) topic for instructions on how to generate keys and set them in the specific values in the NGINX Agent configuration. ## Enabling mTLS @@ -50,10 +50,10 @@ nginx-agent --tls-cert "path-to-cert" --tls-key "path-to-key" --tls-ca "path-to- To enable mTLS for NGINX Agent using environment variables, run the following commands: ```bash -NMS_TLS_CA="my-env-ca" -NMS_TLS_KEY="my-env-key" -NMS_TLS_CERT="my-env-cert" -NMS_TLS_ENABLE=true +NGINX_AGENT_TLS_CA="my-env-ca" +NGINX_AGENT_TLS_KEY="my-env-key" +NGINX_AGENT_TLS_CERT="my-env-cert" +NGINX_AGENT_TLS_ENABLE=true ```
@@ -87,7 +87,7 @@ nginx-agent --tls-enable To enable server-side TLS using environment variables, run the following commands: ```bash -NMS_TLS_ENABLE=true +NGINX_AGENT_TLS_ENABLE=true ```
@@ -110,7 +110,7 @@ tls: To enable insecure mode, you simply need to set `tls:enable` to `false`. Setting this value to `false` can be done only by updating the configuration file or with environment variables. See the following examples: -### Enabling Insecure Mode via Config Values** +### Enabling Insecure Mode via Config Values You can edit the `/etc/nginx-agent/nginx-agent.conf` file to enable insecure mode. Make the following changes: @@ -119,10 +119,10 @@ tls: enable: false ``` -### Enabling Insecure Mode with Environment Variables** +### Enabling Insecure Mode with Environment Variables To enable insecure mode using environment variables, run the following commands: ```bash -NMS_TLS_ENABLE=false +NGINX_AGENT_TLS_ENABLE=false ``` diff --git a/site/content/v2/configuration/health-checks.md b/site/content/v2/configuration/health-checks.md new file mode 100644 index 0000000000..f045955fbd --- /dev/null +++ b/site/content/v2/configuration/health-checks.md @@ -0,0 +1,62 @@ +--- +title: "Health checks" +draft: false +weight: 400 +toc: true +tags: [ "docs" ] +categories: ["configuration"] +doctypes: ["task"] +--- + +## Overview + +The REST API includes a health endpoint to verify the status of NGINX Agent. + +## Configure the REST API + +To enable the REST API, add the following configuration to the NGINX Agent configuration file, `/etc/nginx-agent/nginx-agent.conf`: + +```nginx +api: + host: 127.0.0.1 + port: 8038 +``` + +## Using health checks + +After you enable the REST API, calling the `/health` endpoint returns the following JSON response: + +```json +{ + "status": "OK", + "checks": [ + { + "name": "registration", + "status": "OK" + }, + { + "name": "commandConnection", + "status": "OK" + }, + { + "name": "metricsConnection", + "status": "OK" + } + ] +} +``` + +The top-level `status` field is the overall health status of NGINX Agent. The health status can return three different states: + +1. `PENDING`: NGINX Agent is still determining its health status. +2. `OK`: NGINX Agent is in a healthy state. +3. `ERROR`: NGINX Agent is in an unhealthy state. + +The health checkpoint performs three checks to determine the overall health of the NGINX Agent: + +1. `registration`: Checks if NGINX Agent has successfully registered with the management plane server. +2. `commandConnection`: Checks if NGINX Agent is still able to receive and send commands. +3. `metricsConnection`: Checks if NGINX Agent is still able to send metric reports. + +If any of the checks are in an `ERROR` status, then the overall status of NGINX Agent will change to `ERROR` as well. + diff --git a/site/content/installation-upgrade/_index.md b/site/content/v2/installation-upgrade/_index.md similarity index 100% rename from site/content/installation-upgrade/_index.md rename to site/content/v2/installation-upgrade/_index.md diff --git a/site/content/installation-upgrade/container-environments/_index.md b/site/content/v2/installation-upgrade/container-environments/_index.md similarity index 75% rename from site/content/installation-upgrade/container-environments/_index.md rename to site/content/v2/installation-upgrade/container-environments/_index.md index e2de9f52c2..ca964e34b0 100644 --- a/site/content/installation-upgrade/container-environments/_index.md +++ b/site/content/v2/installation-upgrade/container-environments/_index.md @@ -1,5 +1,5 @@ --- -title: "Container Environments" +title: "Container environments" description: "Learn how to build and run NGINX Agent docker images." menu: docs weight: 800 diff --git a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/container-environments/docker-images.md b/site/content/v2/installation-upgrade/container-environments/docker-images.md similarity index 51% rename from site/content/previous-versions/NGINX-agent-v2/installation-upgrade/container-environments/docker-images.md rename to site/content/v2/installation-upgrade/container-environments/docker-images.md index cb164f60a6..40b3a3b2f8 100644 --- a/site/content/previous-versions/NGINX-agent-v2/installation-upgrade/container-environments/docker-images.md +++ b/site/content/v2/installation-upgrade/container-environments/docker-images.md @@ -1,5 +1,5 @@ --- -title: "Build Container Images" +title: "Build container images" draft: false weight: 100 toc: true @@ -11,12 +11,17 @@ docs: "DOCS-1410" ## Overview -NGINX Agent is a companion daemon for NGINX Open Source or NGINX Plus instances and must run in the same container to work. The NGINX Agent GitHub repository includes [Dockerfiles](https://github.com/nginx/agent/tree/main/scripts/docker) that you can use to build custom container images that bundle NGINX Agent with NGINX or NGINX Plus. +NGINX Agent is a companion daemon for NGINX Open Source or NGINX Plus instances and must run in the same container to work. This document explains multiple ways in which NGINX Agent can be run alongside NGINX in a container. If you want to use NGINX Agent with NGINX Plus, you need to purchase an NGINX Plus license. Contact your F5 Sales representative for assistance. See the requirements and supported operating systems in the [NGINX Agent Technical Specifications]({{< relref "technical-specifications.md" >}}) topic. +## Deploy Offical NGINX and NGINX Plus Containers + +Docker images are available in the [Deploying NGINX and NGINX Plus on Docker](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-docker/) NGINX documentation. + +This guide provides instructions on how to build images with NGINX Agent and NGINX packaged together. It includes steps for downloading the necessary Docker images, configuring your Docker environment, and deploying NGINX and NGINX Plus containers. ## Set up your environment @@ -72,16 +77,6 @@ git clone git@github.com:nginx/agent.git {{% /tabs %}} -### Download the agent binary {#agent-binary} - -Before you can build a container image with NGINX, you must build or download the **agent** binary. - -The **agent** binary packages are available from the [NGINX Agent Releases](https://github.com/nginx/agent/releases) page on GitHub. - -Download the binary package for the operating system that you will use in the container image. - -Note the location and name of the downloaded package. You will need to use this when running the **make** command to build the image (referred to as `[PATH-TO-PACKAGE]` in the example commands below). - ### Download the NGINX Plus certificate and key {#myf5-download} {{< fa "circle-info" "text-muted" >}} **This step is required if you are using NGINX Plus. If you are using NGINX open source, you can skip this section.** @@ -105,72 +100,28 @@ In order to build a container image with NGINX Plus, you must provide the SSL ce - Be sure to replace the example certificate and key filenames shown in the example command with your actual file names. - The file names in the *build/certs* directory must match those shown in the example. -## Build the official NGINX Agent image with Docker - -{{}} - -{{%tab name="NGINX Open Source"%}} +## Run the NGINX Agent container -Change to the directory where the Dockerfile is located: +To run NGINX Agent container using Docker use the following command: ```shell -$ cd scripts/docker/official/nginx-oss-with-nginx-agent/alpine/ +docker pull docker-registry.nginx.com/nginx/agent:mainline ``` - -- To build an image that contains the latest NGINX Agent and the latest mainline version of NGINX run the following command: - - ```shell - $ docker build -t nginx-agent . --no-cache -f ./Dockerfile.mainline - ``` - -- To build an image that contains the latest NGINX Agent and the latest stable version of NGINX run the following command: - - ```shell - $ docker build -t nginx-agent . --no-cache -f ./Dockerfile.stable - ``` - -{{% /tab %}} - -{{%tab name="NGINX Plus"%}} - -1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5) and download your "nginx-repo.crt" and "nginx-repo.key" files. These files are also provided with the NGINX Plus trial package. - -1. Copy the files to the directory where the Dockerfile is located **scripts/docker/official/nginx-plus-with-nginx-agent/alpine/**. - -1. To build an image that contains the latest NGINX Agent and the latest version of NGINX Plus change to the directory where the Dockerfile is located: - ```shell -$ cd scripts/docker/official/nginx-plus-with-nginx-agent/alpine/ +docker tag docker-registry.nginx.com/nginx/agent:mainline nginx-agent ``` - -1. Run the following command to build the image: - ```shell -$ docker build -t nginx-agent . \ - --no-cache -f ./Dockerfile \ - --secret id=nginx-crt,src=nginx-repo.crt \ - --secret id=nginx-key,src=nginx-repo.key -``` -{{% /tab %}} -{{% /tabs %}} - - -## Run the NGINX Agent container - -Here is an example of how to run the NGINX Agent container using Docker: - -```console docker run --name nginx-agent -d nginx-agent ``` -{{}}To learn more about the configuration options, refer to the NGINX Agent [Configuration Overview]({{< relref "/configuration/configuration-overview" >}}).{{}} +{{}}To learn more about the configuration options, refer to the NGINX Agent [Configuration Overview]({{< relref "/v2/configuration/configuration-overview" >}}).{{}} ### Enable the gRPC interface To connect your NGINX Agent container to your NGINX One or NGINX Instance Manager instance, you must enable the gRPC interface. To do this, you must edit the NGINX Agent configuration file, *nginx-agent.conf*. For example: ```yaml -erver: +server: host: 127.0.0.1 # mock control plane host grpcPort: 54789 # mock control plane gRPC port @@ -199,6 +150,20 @@ docker run --name nginx-agent -d \ nginx-agent ``` +To ensure that the REST Interface is correctly configured, you can use the `curl` command targeting the following endpoint from your terminal: + +```shell +curl 0.0.0.0:8038/nginx/ +``` + +If the REST Interface is configured correctly, then you should see a JSON object ouputted to the terminal containing metadata such as NGINX version, path to the NGINX conf, and runtime modules. + +**Sample Output:** + +```code +[{"nginx_id":"b636d4376dea15405589692d3c5d3869ff3a9b26b0e7bb4bb1aa7e658ace1437","version":"1.27.1","conf_path":"/etc/nginx/nginx.conf","process_id":"7","process_path":"/usr/sbin/nginx","start_time":1725878806000,"built_from_source":false,"loadable_modules":null,"runtime_modules":["http_addition_module","http_auth_request_module","http_dav_module","http_flv_module","http_gunzip_module","http_gzip_static_module","http_mp4_module","http_random_index_module","http_realip_module","http_secure_link_module","http_slice_module","http_ssl_module","http_stub_status_module","http_sub_module","http_v2_module","http_v3_module","mail_ssl_module","stream_realip_module","stream_ssl_module","stream_ssl_preread_module"],"plus":{"enabled":false,"release":""},"ssl":{"ssl_type":0,"details":["OpenSSL","3.3.0","9 Apr 2024 (running with OpenSSL 3.3.1 4 Jun 2024)"]},"status_url":"","configure_args":["","prefix=/etc/nginx","sbin-path=/usr/sbin/nginx","modules-path=/usr/lib/nginx/modules","conf-path=/etc/nginx/nginx.conf","error-log-path=/var/log/nginx/error.log","http-log-path=/var/log/nginx/access.log","pid-path=/var/run/nginx.pid","lock-path=/var/run/nginx.lock","http-client-body-temp-path=/var/cache/nginx/client_temp","http-proxy-temp-path=/var/cache/nginx/proxy_temp","http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp","http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp","http-scgi-temp-path=/var/cache/nginx/scgi_temp","with-perl_modules_path=/usr/lib/perl5/vendor_perl","user=nginx","group=nginx","with-compat","with-file-aio","with-threads","with-http_addition_module","with-http_auth_request_module","with-http_dav_module","with-http_flv_module","with-http_gunzip_module","with-http_gzip_static_module","with-http_mp4_module","with-http_random_index_module","with-http_realip_module","with-http_secure_link_module","with-http_slice_module","with-http_ssl_module","with-http_stub_status_module","with-http_sub_module","with-http_v2_module","with-http_v3_module","with-mail","with-mail_ssl_module","with-stream","with-stream_realip_module","with-stream_ssl_module","with-stream_ssl_preread_module","with-cc-opt='-Os -fstack-clash-protection -Wformat -Werror=format-security -g'","with-ld-opt=-Wl,--as-needed,-O1,--sort-common"],"error_log_paths":null}] +``` +
## Build the NGINX Agent images for specific OS targets @@ -207,175 +172,49 @@ docker run --name nginx-agent -d \ The NGINX Agent GitHub repo has a set of Make commands that you can use to build a container image for an specific operating system and version: -- `make official-oss-image` builds an image containing NGINX Agent and NGINX open source. -- `make official-plus-image` builds an image containing NGINX Agent and NGINX Plus. +- `make oss-image` builds an image containing NGINX Agent and NGINX open source. +- `make image` builds an image containing NGINX Agent and NGINX Plus. You can pass the following arguments when running the **make** command to build an NGINX Agent container image. {{}} | Argument | Definition | | ---------------- | -------------------------| -| PACKAGE_NAME | **Required.** The full path to the downloaded [agent binary package](#agent-binary).
Must precede the **make** command. | | OS_RELEASE | The Linux distribution to use as the base image.
Can also be set in the repo Makefile.| | OS_VERSION | The version of the Linux distribution to use as the base image.
Can also be set in the repo Makefile.| -{{
}} - -Refer to the [Supported distributions](technical-specifications.md/#supported-distributions) table to find out which base images you can use. -You can find the official images and versions for each distribution on [Docker Hub](https://hub.docker.com/search?image_filter=official&q=&type=image). +| AGENT_VERSION | The versions of NGINX agent that you want installed on the image.| -Keep the following information in mind when using the NGINX Agent [Dockerfiles](https://github.com/nginx/agent/tree/main/scripts/docker) to build container images: - -- On some operating systems, you need root privileges (**sudo**) to run **make** commands. -- If you choose to run the **docker build** or **podman build** command instead of using the **make** commands provided, you must do so from the nginx-agent repository's root directory. +{{
}} ### Build NGINX open source images -Run the following **make** command to build the default image, which uses Alpine 3.19 as the base image. - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] make official-oss-image -``` - -### Example build commands by distribution - -{{}} - -{{%tab name="alma linux"%}} - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=almalinux make oss-image -``` - -{{% /tab %}} - -{{%tab name="alpine linux"%}} - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=alpine make oss-image -``` - -{{% /tab %}} - -{{%tab name="amazon linux"%}} - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=amazonlinux make oss-image -``` - -{{% /tab %}} - -{{%tab name="debian"%}} +Run the following `make` command to build the default image, which uses Alpine as the base image: ```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=debian make oss-image +IMAGE_BUILD_TARGET=install-agent-repo make oss-image ``` -{{% /tab %}} - -{{%tab name="oracle linux"%}} - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=oraclelinux make oss-image -``` - -{{% /tab %}} - -{{%tab name="rocky linux"%}} - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=rockylinux make oss-image -``` - -{{% /tab %}} - -{{%tab name="ubuntu"%}} - -The command below creates a base image using the most recent LTS version of Ubuntu as the base image: +To build an image with Debian and an older version of NGINX Agent you can run the following command: ```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] make oss-image OS_RELEASE=ubuntu +IMAGE_BUILD_TARGET=install-agent-repo NGINX_AGENT_VERSION=2.37.0~bullseye OS_RELEASE=debian OS_VERSION=bullseye-slim make oss-image ``` -{{% /tab %}} - -{{% /tabs %}} - ### Build NGINX Plus images {{}}You need a license to use NGINX Agent with NGINX Plus. You must complete the steps in the [Download the certificate and key files from MyF5](#myf5-download) section before proceeding.{{}} -Run the following `make` command to build the default image, which uses Ubuntu 22.04 (Jammy) as the base image. - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] make official-plus-image -``` - -### Example NGINX Plus build commands by distribution - -{{}} - -{{%tab name="alpine linux"%}} - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=alpine make official-plus-image -``` - -{{% /tab %}} - -{{%tab name="amazon linux"%}} +Run the following `make` command to build the default image, which uses Ubuntu 24.04 (Noble) as the base image. ```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=amazonlinux make official-plus-image +IMAGE_BUILD_TARGET=install-agent-repo make image ``` -{{% /tab %}} - -{{%tab name="centos"%}} +To build an image with Debian and an older version of NGINX Agent you can run the following command: ```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=centos OS_VERSION=7 make official-plus-image +IMAGE_BUILD_TARGET=install-agent-repo NGINX_AGENT_VERSION=2.37.0~bullseye OS_RELEASE=debian OS_VERSION=bullseye-slim make image ``` -{{% /tab %}} - -{{%tab name="debian"%}} - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=debian OS_VERSION=bullseye-slim make official-plus-image -``` - -{{% /tab %}} -{{%tab name="oracle linux"%}} -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=oraclelinux make official-plus-image -``` - -{{% /tab %}} - -{{%tab name="rhel"%}} - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=redhatenterprise make official-plus-image -``` - -{{% /tab %}} - -{{%tab name="suse"%}} - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=suse OS_VERSION=sle15 make official-plus-image -``` - -{{% /tab %}} - -{{%tab name="ubuntu"%}} - -```shell -PACKAGE_NAME=[PATH-TO-PACKAGE] OS_RELEASE=ubuntu make official-plus-image -``` - -{{% /tab %}} - -{{% /tabs %}} diff --git a/site/content/installation-upgrade/container-environments/docker-support.md b/site/content/v2/installation-upgrade/container-environments/docker-support.md similarity index 91% rename from site/content/installation-upgrade/container-environments/docker-support.md rename to site/content/v2/installation-upgrade/container-environments/docker-support.md index be0605ab55..b0bdd98a65 100644 --- a/site/content/installation-upgrade/container-environments/docker-support.md +++ b/site/content/v2/installation-upgrade/container-environments/docker-support.md @@ -7,11 +7,12 @@ tags: - docs toc: true weight: 200 +docs: "DOCS-909" --- ## Overview -The NGINX Agent repository includes [Dockerfiles](https://github.com/nginx/agent/tree/main/scripts/docker) that can be used to [build custom container images]({{< relref "installation-upgrade/container-environments/docker-images.md" >}}). Images are created with an NGINX Open Source or NGINX Plus instance and are available for various operating systems. +The NGINX Agent repository includes [Dockerfiles](https://github.com/nginx/agent/tree/main/scripts/docker) that can be used to [build custom container images]({{< relref "/v2/installation-upgrade/container-environments/docker-images.md" >}}). Images are created with an NGINX Open Source or NGINX Plus instance and are available for various operating systems. See the [Technical Specifications]({{< relref "/technical-specifications.md#container-support" >}}) for a list of supported operationg systems. diff --git a/site/content/installation-upgrade/getting-started.md b/site/content/v2/installation-upgrade/getting-started.md similarity index 92% rename from site/content/installation-upgrade/getting-started.md rename to site/content/v2/installation-upgrade/getting-started.md index e3be8c8095..578037f537 100644 --- a/site/content/installation-upgrade/getting-started.md +++ b/site/content/v2/installation-upgrade/getting-started.md @@ -4,6 +4,7 @@ draft: false weight: 100 toc: true tags: [ "docs" ] +docs: "DOCS-1089" categories: ["configuration"] doctypes: ["task"] --- @@ -14,7 +15,7 @@ Follow these steps to configure and run NGINX Agent and a mock interface ("contr ## Install NGINX -Follow the steps in the [Installation]({{< relref "/installation-upgrade/installation-github.md" >}}) section to download, install, and run NGINX. +Follow the steps in the [Installation](https://docs.nginx.com/nginx/admin-guide/installing-nginx/) section to download, install, and run NGINX. ## Clone the NGINX Agent Repository @@ -22,7 +23,7 @@ Using your preferred method, clone the NGINX Agent repository into your developm ## Install Go -NGINX Agent and the Mock Control Plane are written in Go. Go 1.23.0 or higher is required to build and run either application from the source code directory. You can [download Go from the official website](https://go.dev/dl/). +NGINX Agent and the Mock Control Plane are written in Go. Go 1.23 or higher is required to build and run either application from the source code directory. You can [download Go from the official website](https://go.dev/dl/). ## Start the gRPC Mock Control Plane @@ -93,7 +94,7 @@ The mock control plane can use either gRPC or REST protocols to communicate with ## Launch Swagger UI -Swagger UI requires goswagger be installed. See [instructions for installing goswagger](https://goswagger.io/install.html) for additional help. +Swagger UI requires goswagger be installed. See [instructions for installing goswagger](https://goswagger.io/go-swagger/install/) for additional help. To launch the Swagger UI for the REST interface run the following command: @@ -176,5 +177,5 @@ NGINX Agent uses formatted log files to collect metrics. Expanding log formats a {{< important >}} Without log rotation or storage on a separate partition, log files could use up all the free drive space and cause your system to become unresponsive to certain services. -For more information, see [NGINX Agent Log Rotation]({{< relref "configuration/configuration-overview.md#nginx-agent-log-rotation" >}}). +For more information, see [NGINX Agent Log Rotation]({{< relref "/v2/configuration/configuration-overview.md#nginx-agent-log-rotation" >}}). {{< /important >}} diff --git a/site/content/installation-upgrade/installation-github.md b/site/content/v2/installation-upgrade/installation-github.md similarity index 98% rename from site/content/installation-upgrade/installation-github.md rename to site/content/v2/installation-upgrade/installation-github.md index 20c3568f2b..d53a07006e 100644 --- a/site/content/installation-upgrade/installation-github.md +++ b/site/content/v2/installation-upgrade/installation-github.md @@ -4,6 +4,7 @@ draft: false weight: 200 toc: true tags: [ "docs" ] +docs: "DOCS-1090" categories: ["configuration"] doctypes: ["task"] --- diff --git a/site/content/installation-upgrade/installation-oss.md b/site/content/v2/installation-upgrade/installation-oss.md similarity index 69% rename from site/content/installation-upgrade/installation-oss.md rename to site/content/v2/installation-upgrade/installation-oss.md index d3c42ef31f..5e82dd21b1 100644 --- a/site/content/installation-upgrade/installation-oss.md +++ b/site/content/v2/installation-upgrade/installation-oss.md @@ -4,6 +4,7 @@ draft: false weight: 300 toc: true tags: [ "docs" ] +docs: "DOCS-1216" categories: ["configuration"] doctypes: ["task"] --- @@ -15,7 +16,7 @@ Learn how to install NGINX Agent from the NGINX Open Source repository. ## Prerequisites - NGINX installed. Once installed, ensure it is running. If you don't have it installed already, follow these steps to install [NGINX](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/) -- A [supported operating system and architecture](../technical-specifications/#supported-distributions) +- A [supported operating system and architecture]({{< relref "/technical-specifications.md#supported-distributions" >}}) - `root` privilege ## Configure NGINX OSS Repository for installing NGINX Agent @@ -27,7 +28,8 @@ Before you install NGINX Agent for the first time on your system, you need to se - [Installing NGINX Agent on Debian](#installing-nginx-agent-on-debian) - [Installing NGINX Agent on SLES](#installing-nginx-agent-on-sles) - [Installing NGINX Agent on Alpine Linux](#installing-nginx-agent-on-alpine-linux) -- [Installing NGINX Agent on Amazon Linux](#installing-nginx-agent-on-amazon-linux) +- [Installing NGINX Agent on Amazon Linux 2](#installing-nginx-agent-on-amazon-linux-2) +- [Installing NGINX Agent on Amazon Linux 2023](#installing-nginx-agent-on-amazon-linux-2023) - [Installing NGINX Agent on FreeBSD](#installing-nginx-agent-on-freebsd) ### Installing NGINX Agent on RHEL, CentOS, Rocky Linux, AlmaLinux, and Oracle Linux @@ -56,7 +58,7 @@ Before you install NGINX Agent for the first time on your system, you need to se sudo yum install nginx-agent ``` - When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. + When prompted to accept the GPG key, verify that the fingerprint matches `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3`, and if so, accept it. ### Installing NGINX Agent on Ubuntu @@ -79,12 +81,20 @@ Before you install NGINX Agent for the first time on your system, you need to se gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg ``` - The output should contain the full fingerprint `573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62` as follows: + The output should contain the full fingerprints `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3` as follows: ``` - pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] - 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 - uid nginx signing key + pub rsa4096 2024-05-29 [SC] + 8540A6F18833A80E9C1653A42FD21310B49F6B46 + uid nginx signing key + + pub rsa2048 2011-08-19 [SC] [expires: 2027-05-24] + 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 + uid nginx signing key + + pub rsa4096 2024-05-29 [SC] + 9E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3 + uid nginx signing key ``` {{< important >}}If the fingerprint is different, remove the file.{{< /important >}} @@ -133,12 +143,20 @@ Before you install NGINX Agent for the first time on your system, you need to se --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg ``` - The output should contain the full fingerprint `573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62` as follows: + The output should contain the full fingerprints `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3` as follows: ``` - pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] - 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 - uid nginx signing key + pub rsa4096 2024-05-29 [SC] + 8540A6F18833A80E9C1653A42FD21310B49F6B46 + uid nginx signing key + + pub rsa2048 2011-08-19 [SC] [expires: 2027-05-24] + 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 + uid nginx signing key + + pub rsa4096 2024-05-29 [SC] + 9E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3 + uid nginx signing key ``` {{< important >}}If the fingerprint is different, remove the file.{{< /important >}} @@ -191,12 +209,20 @@ Before you install NGINX Agent for the first time on your system, you need to se gpg --with-fingerprint --dry-run --quiet --no-keyring --import --import-options import-show /tmp/nginx_signing.key ``` -1. The output should contain the full fingerprint `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62` as follows: +1. The output should contain the full fingerprints `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3` as follows: ``` - pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] - 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62 - uid nginx signing key + pub rsa4096 2024-05-29 [SC] + 8540A6F18833A80E9C1653A42FD21310B49F6B46 + uid nginx signing key + + pub rsa2048 2011-08-19 [SC] [expires: 2027-05-24] + 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 + uid nginx signing key + + pub rsa4096 2024-05-29 [SC] + 9E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3 + uid nginx signing key ``` 1. Finally, import the key to the rpm database: @@ -291,7 +317,43 @@ Before you install NGINX Agent for the first time on your system, you need to se sudo nginx-agent -v ``` -### Installing NGINX Agent on Amazon Linux +### Installing NGINX Agent on Amazon Linux 2023 + +1. Install the prerequisites: + + ```shell + sudo dnf install yum-utils procps-ng + ``` + +1. To set up the dnf repository for Amazon Linux 2023, create the file named `/etc/yum.repos.d/nginx-agent.repo` with the following contents: + ``` + [nginx-agent] + name=nginx agent repo + baseurl=https://packages.nginx.org/nginx-agent/amzn/2023/$basearch/ + gpgcheck=1 + enabled=1 + gpgkey=https://nginx.org/keys/nginx_signing.key + module_hotfixes=true + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo dnf install nginx-agent + ``` + +1. When prompted to accept the GPG key, verify that the fingerprint matches + `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, + `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, + `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3` + and if so, accept it. + +1. Verify the installation: + + ```shell + sudo nginx-agent -v + ``` +### Installing NGINX Agent on Amazon Linux 2 1. Install the prerequisites: @@ -316,7 +378,7 @@ Before you install NGINX Agent for the first time on your system, you need to se sudo yum install nginx-agent ``` -1. When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. +1. When prompted to accept the GPG key, verify that the fingerprint matches `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3`, and if so, accept it. 1. Verify the installation: diff --git a/site/content/installation-upgrade/installation-plus.md b/site/content/v2/installation-upgrade/installation-plus.md similarity index 81% rename from site/content/installation-upgrade/installation-plus.md rename to site/content/v2/installation-upgrade/installation-plus.md index 643d021697..ba42502106 100644 --- a/site/content/installation-upgrade/installation-plus.md +++ b/site/content/v2/installation-upgrade/installation-plus.md @@ -4,6 +4,7 @@ draft: false weight: 400 toc: true tags: [ "docs" ] +docs: "DOCS-1217" categories: ["configuration"] doctypes: ["task"] --- @@ -16,7 +17,7 @@ Learn how to install NGINX Agent from NGINX Plus repository - An NGINX Plus subscription (purchased or trial) - NGINX Plus installed. Once installed, ensure it is running. If you don't have it installed already, follow these steps to install [NGINX Plus](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-plus/) -- A [supported operating system and architecture](../technical-specifications/#supported-distributions) +- A [supported operating system and architecture]({{< relref "/technical-specifications.md#supported-distributions" >}}) - `root` privilege - Your credentials to the MyF5 Customer Portal, provided by email from F5, Inc. - Your NGINX Plus certificate and public key (`nginx-repo.crt` and `nginx-repo.key` files), provided by email from F5, Inc. @@ -30,6 +31,7 @@ Before you install NGINX Agent for the first time on your system, you need to se - [Installing NGINX Agent on Debian](#installing-nginx-agent-on-debian) - [Installing NGINX Agent on SLES](#installing-nginx-agent-on-sles) - [Installing NGINX Agent on Alpine Linux](#installing-nginx-agent-on-alpine-linux) +- [Installing NGINX Agent on Amazon Linux 2023](#installing-nginx-agent-on-amazon-linux-2023) - [Installing NGINX Agent on Amazon Linux](#installing-nginx-agent-on-amazon-linux) - [Installing NGINX Agent on FreeBSD](#installing-nginx-agent-on-freebsd) @@ -79,7 +81,7 @@ Before you install NGINX Agent for the first time on your system, you need to se sudo yum install nginx-agent ``` - When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. + When prompted to accept the GPG key, verify that the fingerprint matches `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3`, and if so, accept it. 1. Verify the installation: @@ -243,12 +245,20 @@ Before you install NGINX Agent for the first time on your system, you need to se gpg --with-fingerprint --dry-run --quiet --no-keyring --import --import-options import-show /tmp/nginx_signing.key ``` -1. The output should contain the full fingerprint `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62` as follows: +1. The output should contain the full fingerprints `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3` as follows: ``` - pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] - 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62 - uid nginx signing key + pub rsa4096 2024-05-29 [SC] + 8540A6F18833A80E9C1653A42FD21310B49F6B46 + uid nginx signing key + + pub rsa2048 2011-08-19 [SC] [expires: 2027-05-24] + 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 + uid nginx signing key + + pub rsa4096 2024-05-29 [SC] + 9E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3 + uid nginx signing key ``` 1. Finally, import the key to the rpm database: @@ -352,7 +362,55 @@ Before you install NGINX Agent for the first time on your system, you need to se sudo nginx-agent -v ``` -### Installing NGINX Agent on Amazon Linux +### Installing NGINX Agent on Amazon Linux 2023 + +1. Create the `/etc/ssl/nginx` directory: + + ```shell + sudo mkdir -p /etc/ssl/nginx + ``` + +1. Log in to [MyF5 Customer Portal](https://account.f5.com/myf5/) and download your `nginx-repo.crt` and `nginx-repo.key` files. + +1. Copy the `nginx-repo.crt` and `nginx-repo.key` files to the `/etc/ssl/nginx/` directory: + + ```shell + sudo cp nginx-repo.crt nginx-repo.key /etc/ssl/nginx/ + ``` + +1. Install the prerequisites: + + ```shell + sudo dnf install yum-utils procps-ng ca-certificates + ``` + +1. To set up the dnf repository for Amazon Linux 2023, create the file named `/etc/yum.repos.d/nginx-agent.repo` with the following contents: + + ``` + [nginx-agent] + name=nginx-agent repo + baseurl=https://packages.nginx.org/nginx-agent/amzn/2023/$basearch/ + sslclientcert=/etc/ssl/nginx/nginx-repo.crt + sslclientkey=/etc/ssl/nginx/nginx-repo.key + gpgcheck=0 + enabled=1 + ``` + +1. To install `nginx-agent`, run the following command: + + ```shell + sudo dnf install nginx-agent + ``` + +1. When prompted to accept the GPG key, verify that the fingerprint matches `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3`, and if so, accept it. + +1. Verify the installation: + + ```shell + sudo nginx-agent -v + ``` + +### Installing NGINX Agent on Amazon Linux 2 1. Create the `/etc/ssl/nginx` directory: @@ -379,7 +437,7 @@ Before you install NGINX Agent for the first time on your system, you need to se ``` [nginx-agent] name=nginx-agent repo - baseurl=https://pkgs.nginx.com/nginx-agent/amzn2/$releasever/$basearch + baseurl=https://pkgs.nginx.com/nginx-agent/amzn/2023/$releasever/$basearch sslclientcert=/etc/ssl/nginx/nginx-repo.crt sslclientkey=/etc/ssl/nginx/nginx-repo.key gpgcheck=0 @@ -392,7 +450,7 @@ Before you install NGINX Agent for the first time on your system, you need to se sudo yum install nginx-agent ``` -1. When prompted to accept the GPG key, verify that the fingerprint matches `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, and if so, accept it. +1. When prompted to accept the GPG key, verify that the fingerprint matches `8540 A6F1 8833 A80E 9C16 53A4 2FD2 1310 B49F 6B46`, `573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62`, `9E9B E90E ACBC DE69 FE9B 204C BCDC D8A3 8D88 A2B3`, and if so, accept it. 1. Verify the installation: diff --git a/site/content/installation-upgrade/uninstall.md b/site/content/v2/installation-upgrade/uninstall.md similarity index 91% rename from site/content/installation-upgrade/uninstall.md rename to site/content/v2/installation-upgrade/uninstall.md index 0431f72bda..49184df826 100644 --- a/site/content/installation-upgrade/uninstall.md +++ b/site/content/v2/installation-upgrade/uninstall.md @@ -4,6 +4,7 @@ draft: false weight: 700 toc: true tags: [ "docs" ] +docs: "DOCS-1230" categories: ["configuration"] doctypes: ["task"] --- @@ -113,7 +114,7 @@ Complete the following steps on each host where you've installed NGINX agent: sudo apk del nginx-agent ``` -### Uninstalling NGINX Agent on Amazon Linux +### Uninstalling NGINX Agent on Amazon Linux 2 Complete the following steps on each host where you've installed NGINX agent: @@ -129,6 +130,21 @@ Complete the following steps on each host where you've installed NGINX agent: sudo yum remove nginx-agent ``` +### Uninstalling NGINX Agent on Amazon Linux 2023 + +Complete the following steps on each host where you've installed NGINX agent: + +1. Stop NGINX agent: + + ```bash + sudo systemctl stop nginx-agent + ``` + +2. To uninstall NGINX agent, run the following command: + + ```bash + sudo dnf remove nginx-agent + ``` ### Uninstalling NGINX Agent on FreeBSD Complete the following steps on each host where you've installed NGINX agent: diff --git a/site/content/installation-upgrade/upgrade.md b/site/content/v2/installation-upgrade/upgrade.md similarity index 99% rename from site/content/installation-upgrade/upgrade.md rename to site/content/v2/installation-upgrade/upgrade.md index 4e0f445398..f5e3409af7 100644 --- a/site/content/installation-upgrade/upgrade.md +++ b/site/content/v2/installation-upgrade/upgrade.md @@ -4,6 +4,7 @@ draft: false weight: 600 toc: true tags: [ "docs" ] +docs: "DOCS-1227" categories: ["configuration"] doctypes: ["task"] --- diff --git a/site/content/v2/metrics.md b/site/content/v2/metrics.md new file mode 100644 index 0000000000..e90e55c931 --- /dev/null +++ b/site/content/v2/metrics.md @@ -0,0 +1,10 @@ +--- +title: Metrics +catalog: true +catalogType: v2metrics +toc: true +weight: 200 +docs: DOCS-000 +--- + +{{< v2-metrics >}} \ No newline at end of file diff --git a/site/content/previous-versions/NGINX-agent-v2/technical-specifications.md b/site/content/v2/technical-specifications.md similarity index 87% rename from site/content/previous-versions/NGINX-agent-v2/technical-specifications.md rename to site/content/v2/technical-specifications.md index 52864eaa48..efa731527b 100644 --- a/site/content/previous-versions/NGINX-agent-v2/technical-specifications.md +++ b/site/content/v2/technical-specifications.md @@ -1,16 +1,13 @@ --- -title: "Technical Specifications" -draft: false -description: "This document describes the requirements for NGINX Agent." -weight: 200 +title: "Technical specifications" +weight: 100 toc: true -tags: [ "docs" ] docs: "DOCS-1092" -categories: ["development"] -doctypes: ["task"] --- -## Supported Distributions +This document describes the requirements for NGINX Agent v2. + +## Supported distributions NGINX Agent can run in most environments. We support the following distributions: @@ -29,7 +26,7 @@ NGINX Agent can run in most environments. We support the following distributions {{< /bootstrap-table >}} -## Supported Deployment Environments +## Supported deployment environments NGINX Agent can be deployed in the following environments: @@ -38,12 +35,12 @@ NGINX Agent can be deployed in the following environments: - Public Cloud: AWS, Google Cloud Platform, and Microsoft Azure - Virtual Machine -## Supported NGINX Versions +## Supported NGINX versions NGINX Agent works with all supported versions of NGINX Open Source and NGINX Plus. -## Sizing Recommendations +## Sizing recommendations Minimum system sizing recommendations for NGINX Agent: {{< bootstrap-table "table table-striped table-bordered" >}} diff --git a/site/go.mod b/site/go.mod index 1675cfcc8c..e6c32c9f66 100644 --- a/site/go.mod +++ b/site/go.mod @@ -2,4 +2,4 @@ module github.com/nginx/agent/site go 1.18 -require github.com/nginxinc/nginx-hugo-theme v0.40.8 // indirect +require github.com/nginxinc/nginx-hugo-theme v0.41.23 // indirect diff --git a/site/go.sum b/site/go.sum index bd8c870ccb..3e619b076d 100644 --- a/site/go.sum +++ b/site/go.sum @@ -10,3 +10,5 @@ github.com/nginxinc/nginx-hugo-theme v0.35.0 h1:7XB2GMy6qeJgKEJy9wOS3SYKYpfvLW3/ github.com/nginxinc/nginx-hugo-theme v0.35.0/go.mod h1:DPNgSS5QYxkjH/BfH4uPDiTfODqWJ50NKZdorguom8M= github.com/nginxinc/nginx-hugo-theme v0.40.8 h1:VtoSAtf9k67tI2jzbLRo0oFBAMHZBUPRh/xV4MYullI= github.com/nginxinc/nginx-hugo-theme v0.40.8/go.mod h1:DPNgSS5QYxkjH/BfH4uPDiTfODqWJ50NKZdorguom8M= +github.com/nginxinc/nginx-hugo-theme v0.41.23 h1:ddIfLF7BFd78qyIn3z5aReeC4BO/m9FH81d5S+al/6s= +github.com/nginxinc/nginx-hugo-theme v0.41.23/go.mod h1:DPNgSS5QYxkjH/BfH4uPDiTfODqWJ50NKZdorguom8M= diff --git a/site/layouts/agent-v2-migration/list.html b/site/layouts/agent-v2-migration/list.html new file mode 100644 index 0000000000..54b0b0f66b --- /dev/null +++ b/site/layouts/agent-v2-migration/list.html @@ -0,0 +1,10 @@ +{{ define "main" }} +
+ +
+ {{ partial "agent-v2-migration/list-main" . }} +
+
+{{ end }} \ No newline at end of file diff --git a/site/layouts/agent-v2-migration/single.html b/site/layouts/agent-v2-migration/single.html new file mode 100644 index 0000000000..e918630803 --- /dev/null +++ b/site/layouts/agent-v2-migration/single.html @@ -0,0 +1,49 @@ +{{ define "main" }} +
+ + + {{if (.Params.catalog) }} +
+ {{ else if and (gt .WordCount 200 ) (.Params.toc) }} +
+ {{ else }} +
+ {{ end }} + +
+
+ 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. +
+
+ +

{{ .Title }}

+ + {{ if eq .Page.Draft true }}{{ partial "draft-badge.html" . }}{{ end }} + {{ if .Description }}

{{ .Description | markdownify }}

{{ end}} + + {{ if in .Params.doctypes "beta" }}{{ partial "beta-badge" . }}{{ end }} + + {{ .Content }} + {{ partial "version-list" . }} +
+ {{ partial "previous-next-links-in-section-with-title.html" . }} + +
+ {{ if and (gt .WordCount 200 ) (.Params.toc) }} + {{ if (add (len (findRE " + {{ partial "toc.html" . }} +
+ {{ end }} + {{ end }} +
+ +{{if .Params.script}} + {{ $script := (delimit (slice "scripts" .Params.script) "/")}} + {{ partial (string $script) .}} +{{end }} + +{{ end }} \ No newline at end of file diff --git a/site/layouts/catalogs/single.html b/site/layouts/catalogs/single.html new file mode 100644 index 0000000000..57b1d77790 --- /dev/null +++ b/site/layouts/catalogs/single.html @@ -0,0 +1,14 @@ +{{ define "main" }} +
+ + + {{ .Content }} + +{{if .Params.script}} + {{ $script := (delimit (slice "scripts" .Params.script) "/")}} + {{ partial (string $script) .}} +{{end }} + +{{ end }} diff --git a/site/layouts/partials/agent-v2-migration/list-main.html b/site/layouts/partials/agent-v2-migration/list-main.html new file mode 100644 index 0000000000..51c39a214b --- /dev/null +++ b/site/layouts/partials/agent-v2-migration/list-main.html @@ -0,0 +1,53 @@ +
+
+ +
+ +
+
+
+ {{ range .Pages.GroupBy "Section" }} + + {{ range .Pages.ByWeight }} +
+
+

+ + {{ .Title }} +

+ {{/*}}

+ {{ if .Description }}{{ .Description | markdownify }}{{ end }} +

{{*/}} + +
+
+ + {{ end }} +
+
+ {{ end }} + + +
+ +
\ No newline at end of file diff --git a/site/layouts/shortcodes/v2-metrics.html b/site/layouts/shortcodes/v2-metrics.html new file mode 100644 index 0000000000..dc14d9a35e --- /dev/null +++ b/site/layouts/shortcodes/v2-metrics.html @@ -0,0 +1,56 @@ +
+ {{ range .Site.Data.v2metrics }} + +

{{.name}} + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
description{{.description}}
type{{.type}}
categories{{.categories}}
source{{.source}}
rollup_aggregate{{.rollup_aggregate}}
unit{{.unit}}
aggregations + {{ range .aggregations }} + {{ . }}; + {{end}} +
dimensions + {{ range sort .dimensions }} +
  • + {{ . }} +
  • + {{end}} +
    +
    + {{ end }} +
    \ No newline at end of file diff --git a/test/config/collector/test-opentelemetry-collector-agent.yaml b/test/config/collector/test-opentelemetry-collector-agent.yaml index a4f5084a26..9b103b67f1 100644 --- a/test/config/collector/test-opentelemetry-collector-agent.yaml +++ b/test/config/collector/test-opentelemetry-collector-agent.yaml @@ -17,7 +17,10 @@ receivers: key_file: /tmp/key.pem ca_file: /tmp/ca.pem nginx/123: - endpoint: "http://localhost:80/status" + api_details: + url: "http://localhost:80/status" + listen: "" + location: "" 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\"" @@ -53,7 +56,7 @@ exporters: sampling_thereafter: 200 extensions: health_check: - endpoint: "localhost:1337" + endpoint: "127.0.0.1:1337" headers_setter: headers: - action: "insert" diff --git a/test/docker/nginx-plus/deb/Dockerfile b/test/docker/nginx-plus/deb/Dockerfile index 0754e4bd02..392ed5fb70 100644 --- a/test/docker/nginx-plus/deb/Dockerfile +++ b/test/docker/nginx-plus/deb/Dockerfile @@ -11,6 +11,8 @@ WORKDIR /agent COPY ./build /agent/build COPY $ENTRY_POINT /agent/entrypoint.sh +ENV PLUS_VERSION=R32 + RUN --mount=type=secret,id=nginx-crt,dst=nginx-repo.crt \ --mount=type=secret,id=nginx-key,dst=nginx-repo.key \ set -x \ @@ -47,7 +49,7 @@ RUN --mount=type=secret,id=nginx-crt,dst=nginx-repo.crt \ && echo "Acquire::https::pkgs.nginx.com::Verify-Host \"true\";" >> /etc/apt/apt.conf.d/90nginx \ && echo "Acquire::https::pkgs.nginx.com::SslCert \"/etc/ssl/nginx/nginx-repo.crt\";" >> /etc/apt/apt.conf.d/90nginx \ && echo "Acquire::https::pkgs.nginx.com::SslKey \"/etc/ssl/nginx/nginx-repo.key\";" >> /etc/apt/apt.conf.d/90nginx \ - && printf "deb https://pkgs.nginx.com/plus/ubuntu `lsb_release -cs` nginx-plus\n" > /etc/apt/sources.list.d/nginx-plus.list \ + && printf "deb https://pkgs.nginx.com/plus/${PLUS_VERSION}/ubuntu/ `lsb_release -cs` nginx-plus\n" > /etc/apt/sources.list.d/nginx-plus.list \ && mkdir -p /etc/ssl/nginx \ && cat nginx-repo.crt > /etc/ssl/nginx/nginx-repo.crt \ && cat nginx-repo.key > /etc/ssl/nginx/nginx-repo.key \ diff --git a/test/helpers/cert_utils.go b/test/helpers/cert_utils.go index 40959dc794..04cacfa77b 100644 --- a/test/helpers/cert_utils.go +++ b/test/helpers/cert_utils.go @@ -14,6 +14,7 @@ import ( "fmt" "math/big" "os" + "strings" "testing" "time" @@ -51,7 +52,10 @@ func GenerateSelfSignedCert(t testing.TB) (keyBytes, certBytes []byte) { CommonName: "New Name", Organization: []string{"New Org."}, }, + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, + IsCA: true, } certBytes, err = x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, &key.PublicKey, key) if err != nil { @@ -69,7 +73,13 @@ func WriteCertFiles(t *testing.T, location string, cert Cert) string { Bytes: cert.Contents, }) - certFile := fmt.Sprintf("%s%s%s", location, string(os.PathSeparator), cert.Name) + var certFile string + if strings.HasSuffix(location, string(os.PathSeparator)) { + certFile = fmt.Sprintf("%s%s", location, cert.Name) + } else { + certFile = fmt.Sprintf("%s%s%s", location, string(os.PathSeparator), cert.Name) + } + err := os.WriteFile(certFile, pemContents, permission) require.NoError(t, err) diff --git a/test/helpers/network_utils.go b/test/helpers/network_utils.go new file mode 100644 index 0000000000..4a989b9bfa --- /dev/null +++ b/test/helpers/network_utils.go @@ -0,0 +1,46 @@ +// Copyright (c) F5, Inc. +// +// This source code is licensed under the Apache License, Version 2.0 license found in the +// LICENSE file in the root directory of this source tree. +package helpers + +import ( + "fmt" + "net" + "testing" + "time" + + "golang.org/x/exp/rand" +) + +// GetRandomPort generates a random port for testing and checks if a port is available by attempting to bind to it +func GetRandomPort(t *testing.T) (int, error) { + t.Helper() + rand.Seed(uint64(time.Now().UnixNano())) + + // Define the range for dynamic ports (49152–65535 as per IANA recommendation) + const minPort = 49152 + const maxPort = 65535 + + // try up to 10 times to get a random port + for i := 0; i < 10; i++ { + port := rand.Intn(maxPort-minPort+1) + minPort + + if isPortAvailable(port) { + return port, nil + } + } + + return 0, fmt.Errorf("could not find an available port after multiple attempts") +} + +// isPortAvailable checks if a port is available by attempting to bind to it +func isPortAvailable(port int) bool { + address := fmt.Sprintf("127.0.0.1:%d", port) + conn, err := net.Dial("tcp", address) + if conn != nil { + conn.Close() + } + + return err != nil +} diff --git a/test/helpers/nginx_plus.go b/test/helpers/nginx_plus.go index e095bc4fae..9103ecf198 100644 --- a/test/helpers/nginx_plus.go +++ b/test/helpers/nginx_plus.go @@ -6,7 +6,6 @@ package helpers import ( - "fmt" "net/http" "net/http/httptest" "testing" @@ -20,8 +19,6 @@ const endpointRootPath = "/api/9/" func NewMockNGINXPlusAPIServer(t *testing.T) *httptest.Server { t.Helper() return httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - fmt.Printf("got path %s\n", req.URL.Path) - var payload string switch req.URL.Path { case "/api/": diff --git a/test/integration/grpc_management_plane_api_test.go b/test/integration/grpc_management_plane_api_test.go index 6952ffa507..dd4a4b19b6 100644 --- a/test/integration/grpc_management_plane_api_test.go +++ b/test/integration/grpc_management_plane_api_test.go @@ -117,7 +117,6 @@ func createContainerNetwork(ctx context.Context, tb testing.TB) *testcontainers. tb.Cleanup(func() { networkErr := containerNetwork.Remove(ctx) tb.Logf("Error removing container network: %v", networkErr) - require.NoError(tb, networkErr) }) return containerNetwork diff --git a/test/load/otel_collector_plugin_load_test.go b/test/load/otel_collector_plugin_load_test.go index e1e5bb3b4f..c3797d2e91 100644 --- a/test/load/otel_collector_plugin_load_test.go +++ b/test/load/otel_collector_plugin_load_test.go @@ -33,6 +33,7 @@ func TestMetric10kDPS(t *testing.T) { name := fmt.Sprintf("OTLP-%s-%s", runtime.GOOS, binary) sender := testbed.NewOTLPMetricDataSender(testbed.DefaultHost, 4317) receiver := testbed.NewOTLPDataReceiver(5643) + receiver = receiver.WithCompression("none") t.Run(name, func(t *testing.T) { require.NoError(t, err) diff --git a/test/mock/collector/grafana/provisioning/dashboards/nginx-dashboard.json b/test/mock/collector/grafana/provisioning/dashboards/nginx-dashboard.json index 1744513236..06d15db85a 100644 --- a/test/mock/collector/grafana/provisioning/dashboards/nginx-dashboard.json +++ b/test/mock/collector/grafana/provisioning/dashboards/nginx-dashboard.json @@ -1,440 +1,448 @@ { - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "id": 3, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "maxHeight": 600, - "mode": "single", - "sort": "none" - } + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "nginx_http_conn_count", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{nginx_conn_outcome}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "HTTP Connections Count", - "type": "timeseries" + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_connections_count{instance_type=\"nginx\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{nginx_conn_outcome}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "HTTP Connections Count", + "type": "timeseries" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "maxHeight": 600, - "mode": "single", - "sort": "none" - } + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "nginx_http_conn", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{nginx_conn_outcome}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "HTTP Connections", - "type": "timeseries" + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_connections{instance_type=\"nginx\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{nginx_conn_outcome}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "HTTP Connections", + "type": "timeseries" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "maxHeight": 600, - "mode": "single", - "sort": "none" - } + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "nginx_http_requests", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Total HTTP Requests", - "type": "timeseries" + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_requests{instance_type=\"nginx\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Total HTTP Requests", + "type": "timeseries" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "id": 5, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "nginx_http_response_status", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "HTTP Response Status", - "type": "timeseries" + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" } - ], - "refresh": "5s", - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-5m", - "to": "now" - }, - "timepicker": {}, - "timezone": "browser", - "title": "NGINX OSS", - "uid": "bdogpq9khs9hcb", - "version": 6, - "weekStart": "" -} + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_response_status{instance_type=\"nginx\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "HTTP Response Status", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "NGINX OSS", + "uid": "bdogpq9khs9hcb", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/test/mock/collector/grafana/provisioning/dashboards/nginx-plus-dashboard.json b/test/mock/collector/grafana/provisioning/dashboards/nginx-plus-dashboard.json index 7df4270709..6574b2a6d2 100644 --- a/test/mock/collector/grafana/provisioning/dashboards/nginx-plus-dashboard.json +++ b/test/mock/collector/grafana/provisioning/dashboards/nginx-plus-dashboard.json @@ -1,535 +1,545 @@ { - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { + "annotations": { + "list": [ + { + "builtIn": 1, "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" + "type": "grafana", + "uid": "-- Grafana --" }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "tooltip": { - "mode": "single", - "sort": "none" + "thresholdsStyle": { + "mode": "off" } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "nginx_http_conn_count", - "fullMetaSearch": false, - "includeNullMetadata": false, - "instant": false, - "legendFormat": "{{nginx_conn_outcome}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "HTTP Connections Count", - "type": "timeseries" + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ { - "datasource": { + "datasource": { "type": "prometheus", "uid": "otel-prometheus-scraper" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_connections_count{instance_type=\"nginxplus\"}", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{nginx_conn_outcome}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "HTTP Connections Count", + "type": "timeseries" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 3, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "tooltip": { - "mode": "single", - "sort": "none" + "thresholdsStyle": { + "mode": "off" } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "nginx_http_conn", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{nginx_conn_outcome}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "HTTP Connections", - "type": "timeseries" + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ { - "datasource": { + "datasource": { "type": "prometheus", "uid": "otel-prometheus-scraper" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_connections{instance_type=\"nginxplus\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{nginx_conn_outcome}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "HTTP Connections", + "type": "timeseries" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "tooltip": { - "mode": "single", - "sort": "none" + "thresholdsStyle": { + "mode": "off" } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "nginx_http_requests_count", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Requests", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "HTTP Request Count", - "type": "timeseries" + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ { - "datasource": { + "datasource": { "type": "prometheus", "uid": "otel-prometheus-scraper" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_requests_count{instance_type=\"nginxplus\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Requests", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "HTTP Request Count", + "type": "timeseries" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 5, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "tooltip": { - "mode": "single", - "sort": "none" + "thresholdsStyle": { + "mode": "off" } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "nginx_http_requests", - "fullMetaSearch": false, - "includeNullMetadata": false, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Total HTTP Requests", - "type": "timeseries" + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ { - "datasource": { + "datasource": { "type": "prometheus", "uid": "otel-prometheus-scraper" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_requests{instance_type=\"nginxplus\"}", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Total HTTP Requests", + "type": "timeseries" + }, + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "tooltip": { - "mode": "single", - "sort": "none" + "thresholdsStyle": { + "mode": "off" } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "otel-prometheus-scraper" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "nginx_config_reloads", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Reloads", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "NGINX Config Reloads", - "type": "timeseries" + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" } - ], - "refresh": "", - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-5m", - "to": "now" - }, - "timepicker": {}, - "timezone": "browser", - "title": "NGINX Plus", - "uid": "fdris4hclbqiob", - "version": 1, - "weekStart": "" -} + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_config_reloads{instance_type=\"nginxplus\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Reloads", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "NGINX Config Reloads", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "NGINX Plus", + "uid": "fdris4hclbqiob", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/test/mock/grpc/mock_management_command_service.go b/test/mock/grpc/mock_management_command_service.go index 9fa4cdf2cf..9d1192ea40 100644 --- a/test/mock/grpc/mock_management_command_service.go +++ b/test/mock/grpc/mock_management_command_service.go @@ -236,6 +236,7 @@ func (cs *CommandService) listenForDataPlaneResponses(ctx context.Context, in mp func (cs *CommandService) createServer(logger *slog.Logger) { cs.server = gin.New() + cs.server.Use(gin.Recovery()) cs.server.UseRawPath = true cs.server.Use(sloggin.NewWithConfig(logger, sloggin.Config{DefaultLevel: slog.LevelDebug})) diff --git a/test/mock/grpc/mock_management_file_service.go b/test/mock/grpc/mock_management_file_service.go index 2bd76c50c3..28868c4874 100644 --- a/test/mock/grpc/mock_management_file_service.go +++ b/test/mock/grpc/mock_management_file_service.go @@ -7,6 +7,7 @@ package grpc import ( "context" + "fmt" "log/slog" "os" "path/filepath" @@ -16,6 +17,7 @@ import ( "github.com/nginx/agent/v3/api/grpc/mpi/v1" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -63,9 +65,12 @@ func (mgs *FileService) UpdateOverview( request *v1.UpdateOverviewRequest, ) (*v1.UpdateOverviewResponse, error) { overview := request.GetOverview() - version := overview.GetConfigVersion().GetVersion() - slog.Info("Updating overview", "version", version) + marshaledJSON, errMarshaledJSON := protojson.Marshal(request) + if errMarshaledJSON != nil { + return nil, fmt.Errorf("failed to marshal struct back to JSON: %w", errMarshaledJSON) + } + slog.Info("Updating overview JSON", "overview", marshaledJSON) mgs.instanceFiles[overview.GetConfigVersion().GetInstanceId()] = overview.GetFiles() diff --git a/test/model/config.go b/test/model/config.go index 8d8cdc5594..e20759e7db 100644 --- a/test/model/config.go +++ b/test/model/config.go @@ -9,6 +9,11 @@ import "github.com/nginx/agent/v3/internal/model" func GetConfigContext() *model.NginxConfigContext { return &model.NginxConfigContext{ + StubStatus: &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, AccessLogs: []*model.AccessLog{{Name: "access.logs"}}, ErrorLogs: []*model.ErrorLog{{Name: "error.log"}}, } @@ -22,6 +27,11 @@ func GetConfigContextWithNames( instanceID string, ) *model.NginxConfigContext { return &model.NginxConfigContext{ + StubStatus: &model.APIDetails{ + URL: "", + Listen: "", + Location: "", + }, AccessLogs: []*model.AccessLog{ { Name: accessLogName, diff --git a/test/protos/files.go b/test/protos/files.go index 3abb560bbe..09f8145c2d 100644 --- a/test/protos/files.go +++ b/test/protos/files.go @@ -31,6 +31,7 @@ func CertMeta(fileName, fileHash string) *mpi.FileMeta { Permissions: "0600", FileType: &mpi.FileMeta_CertificateMeta{ CertificateMeta: &mpi.CertificateMeta{ + SerialNumber: []byte("12345-67890"), Issuer: &mpi.X509Name{ Country: []string{"IE"}, Organization: []string{"F5"}, @@ -39,7 +40,6 @@ func CertMeta(fileName, fileHash string) *mpi.FileMeta { Province: []string{"Munster"}, StreetAddress: []string{"90 South Mall"}, PostalCode: []string{"T12 KXV9"}, - SerialNumber: "12345-67890", CommonName: "Example Name", Names: []*mpi.AttributeTypeAndValue{ {Type: "email", Value: "noreply@nginx.com"}, @@ -49,6 +49,7 @@ func CertMeta(fileName, fileHash string) *mpi.FileMeta { {Type: "customID", Value: "98765"}, }, }, + SignatureAlgorithm: mpi.SignatureAlgorithm_SIGNATURE_ALGORITHM_UNKNOWN, PublicKeyAlgorithm: "", }, diff --git a/test/protos/instances.go b/test/protos/instances.go index 6ea7c9b1eb..3bf88555f4 100644 --- a/test/protos/instances.go +++ b/test/protos/instances.go @@ -9,7 +9,7 @@ import ( "fmt" "os" - "github.com/nginx/agent/v3/api/grpc/mpi/v1" + mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" "github.com/nginx/agent/v3/internal/config" ) @@ -27,14 +27,14 @@ const ( childID4 = 321 ) -func GetAgentInstance(processID int32, agentConfig *config.Config) *v1.Instance { - return &v1.Instance{ - InstanceMeta: &v1.InstanceMeta{ +func GetAgentInstance(processID int32, agentConfig *config.Config) *mpi.Instance { + return &mpi.Instance{ + InstanceMeta: &mpi.InstanceMeta{ InstanceId: agentConfig.UUID, - InstanceType: v1.InstanceMeta_INSTANCE_TYPE_AGENT, + InstanceType: mpi.InstanceMeta_INSTANCE_TYPE_AGENT, Version: agentConfig.Version, }, - InstanceRuntime: &v1.InstanceRuntime{ + InstanceRuntime: &mpi.InstanceRuntime{ ProcessId: processID, BinaryPath: "/run/nginx-agent", ConfigPath: agentConfig.Path, @@ -42,20 +42,23 @@ func GetAgentInstance(processID int32, agentConfig *config.Config) *v1.Instance } } -func GetNginxOssInstance(expectedModules []string) *v1.Instance { - return &v1.Instance{ - InstanceMeta: &v1.InstanceMeta{ +func GetNginxOssInstance(expectedModules []string) *mpi.Instance { + return &mpi.Instance{ + InstanceMeta: &mpi.InstanceMeta{ InstanceId: ossInstanceID, - InstanceType: v1.InstanceMeta_INSTANCE_TYPE_NGINX, + InstanceType: mpi.InstanceMeta_INSTANCE_TYPE_NGINX, Version: "1.25.3", }, - InstanceRuntime: &v1.InstanceRuntime{ + InstanceRuntime: &mpi.InstanceRuntime{ ProcessId: processID, BinaryPath: "/usr/local/Cellar/nginx/1.25.3/bin/nginx", ConfigPath: "/usr/local/etc/nginx/nginx.conf", - Details: &v1.InstanceRuntime_NginxRuntimeInfo{ - NginxRuntimeInfo: &v1.NGINXRuntimeInfo{ - StubStatus: "", + Details: &mpi.InstanceRuntime_NginxRuntimeInfo{ + NginxRuntimeInfo: &mpi.NGINXRuntimeInfo{ + StubStatus: &mpi.APIDetails{ + Location: "", + Listen: "", + }, AccessLogs: []string{}, ErrorLogs: []string{}, LoadableModules: expectedModules, @@ -69,25 +72,28 @@ func GetNginxOssInstance(expectedModules []string) *v1.Instance { }, }, }, - InstanceChildren: []*v1.InstanceChild{{ProcessId: childID}, {ProcessId: childID2}}, + InstanceChildren: []*mpi.InstanceChild{{ProcessId: childID}, {ProcessId: childID2}}, }, } } -func GetNginxPlusInstance(expectedModules []string) *v1.Instance { - return &v1.Instance{ - InstanceMeta: &v1.InstanceMeta{ +func GetNginxPlusInstance(expectedModules []string) *mpi.Instance { + return &mpi.Instance{ + InstanceMeta: &mpi.InstanceMeta{ InstanceId: plusInstanceID, - InstanceType: v1.InstanceMeta_INSTANCE_TYPE_NGINX_PLUS, + InstanceType: mpi.InstanceMeta_INSTANCE_TYPE_NGINX_PLUS, Version: "1.25.3 (nginx-plus-r31-p1)", }, - InstanceRuntime: &v1.InstanceRuntime{ + InstanceRuntime: &mpi.InstanceRuntime{ ProcessId: processID, BinaryPath: "/usr/local/Cellar/nginx/1.25.3/bin/nginx", ConfigPath: "/etc/nginx/nginx.conf", - Details: &v1.InstanceRuntime_NginxPlusRuntimeInfo{ - NginxPlusRuntimeInfo: &v1.NGINXPlusRuntimeInfo{ - StubStatus: "", + Details: &mpi.InstanceRuntime_NginxPlusRuntimeInfo{ + NginxPlusRuntimeInfo: &mpi.NGINXPlusRuntimeInfo{ + StubStatus: &mpi.APIDetails{ + Location: "", + Listen: "", + }, AccessLogs: []string{}, ErrorLogs: []string{}, LoadableModules: expectedModules, @@ -102,19 +108,22 @@ func GetNginxPlusInstance(expectedModules []string) *v1.Instance { "stream_proxy_protocol_vendor_module", "stream_realip_module", "stream_ssl_module", "stream_ssl_preread_module", }, - PlusApi: "", + PlusApi: &mpi.APIDetails{ + Location: "", + Listen: "", + }, }, }, - InstanceChildren: []*v1.InstanceChild{{ProcessId: childID}, {ProcessId: childID2}}, + InstanceChildren: []*mpi.InstanceChild{{ProcessId: childID}, {ProcessId: childID2}}, }, } } -func GetUnsupportedInstance() *v1.Instance { - return &v1.Instance{ - InstanceMeta: &v1.InstanceMeta{ +func GetUnsupportedInstance() *mpi.Instance { + return &mpi.Instance{ + InstanceMeta: &mpi.InstanceMeta{ InstanceId: unsuportedInstanceID, - InstanceType: v1.InstanceMeta_INSTANCE_TYPE_UNIT, + InstanceType: mpi.InstanceMeta_INSTANCE_TYPE_UNIT, Version: "", }, InstanceConfig: nil, @@ -122,39 +131,39 @@ func GetUnsupportedInstance() *v1.Instance { } } -func GetMultipleInstances(expectedModules []string) []*v1.Instance { +func GetMultipleInstances(expectedModules []string) []*mpi.Instance { process1 := GetNginxOssInstance(expectedModules) process2 := getSecondNginxOssInstance(expectedModules) - return []*v1.Instance{process1, process2} + return []*mpi.Instance{process1, process2} } -func GetMultipleInstancesWithUnsupportedInstance() []*v1.Instance { +func GetMultipleInstancesWithUnsupportedInstance() []*mpi.Instance { process1 := GetNginxOssInstance([]string{}) process2 := GetUnsupportedInstance() - return []*v1.Instance{process1, process2} + return []*mpi.Instance{process1, process2} } -func GetInstancesNoParentProcess(expectedModules []string) []*v1.Instance { +func GetInstancesNoParentProcess(expectedModules []string) []*mpi.Instance { process1 := GetNginxOssInstance(expectedModules) process1.GetInstanceRuntime().ProcessId = 0 process2 := getSecondNginxOssInstance(expectedModules) process2.GetInstanceRuntime().ProcessId = 0 - return []*v1.Instance{process1, process2} + return []*mpi.Instance{process1, process2} } -func GetFileCache(files ...*os.File) (map[string]*v1.FileMeta, error) { - cache := make(map[string]*v1.FileMeta) +func GetFileCache(files ...*os.File) (map[string]*mpi.FileMeta, error) { + cache := make(map[string]*mpi.FileMeta) for _, file := range files { lastModified, err := CreateProtoTime("2024-01-09T13:22:21Z") if err != nil { return nil, err } - cache[file.Name()] = &v1.FileMeta{ + cache[file.Name()] = &mpi.FileMeta{ ModifiedTime: lastModified, Name: file.Name(), Hash: "BDEIFo9anKNvAwWm9O2LpfvNiNiGMx.c", @@ -164,34 +173,34 @@ func GetFileCache(files ...*os.File) (map[string]*v1.FileMeta, error) { return cache, nil } -func getSecondNginxOssInstance(expectedModules []string) *v1.Instance { +func getSecondNginxOssInstance(expectedModules []string) *mpi.Instance { process2 := GetNginxOssInstance(expectedModules) process2.GetInstanceRuntime().ProcessId = processID2 process2.GetInstanceMeta().InstanceId = secondOssInstanceID process2.GetInstanceRuntime().BinaryPath = "/opt/homebrew/etc/nginx/1.25.3/bin/nginx" - process2.GetInstanceRuntime().InstanceChildren = []*v1.InstanceChild{{ProcessId: childID3}, {ProcessId: childID4}} + process2.GetInstanceRuntime().InstanceChildren = []*mpi.InstanceChild{{ProcessId: childID3}, {ProcessId: childID4}} return process2 } -func GetHealthyInstanceHealth() *v1.InstanceHealth { - return &v1.InstanceHealth{ +func GetHealthyInstanceHealth() *mpi.InstanceHealth { + return &mpi.InstanceHealth{ InstanceId: GetNginxOssInstance([]string{}).GetInstanceMeta().GetInstanceId(), - InstanceHealthStatus: v1.InstanceHealth_INSTANCE_HEALTH_STATUS_HEALTHY, + InstanceHealthStatus: mpi.InstanceHealth_INSTANCE_HEALTH_STATUS_HEALTHY, } } -func GetUnhealthyInstanceHealth() *v1.InstanceHealth { - return &v1.InstanceHealth{ +func GetUnhealthyInstanceHealth() *mpi.InstanceHealth { + return &mpi.InstanceHealth{ InstanceId: GetNginxPlusInstance([]string{}).GetInstanceMeta().GetInstanceId(), - InstanceHealthStatus: v1.InstanceHealth_INSTANCE_HEALTH_STATUS_UNHEALTHY, + InstanceHealthStatus: mpi.InstanceHealth_INSTANCE_HEALTH_STATUS_UNHEALTHY, } } -func GetUnspecifiedInstanceHealth() *v1.InstanceHealth { - return &v1.InstanceHealth{ +func GetUnspecifiedInstanceHealth() *mpi.InstanceHealth { + return &mpi.InstanceHealth{ InstanceId: unsuportedInstanceID, - InstanceHealthStatus: v1.InstanceHealth_INSTANCE_HEALTH_STATUS_UNSPECIFIED, + InstanceHealthStatus: mpi.InstanceHealth_INSTANCE_HEALTH_STATUS_UNSPECIFIED, Description: fmt.Sprintf("failed to get health for instance %s, error: unable "+ "to determine health", unsuportedInstanceID), } diff --git a/test/types/config.go b/test/types/config.go index 3d570c9152..681aa0cc02 100644 --- a/test/types/config.go +++ b/test/types/config.go @@ -11,11 +11,11 @@ import ( "time" "github.com/nginx/agent/v3/internal/config" + "github.com/nginx/agent/v3/test/helpers" + "github.com/stretchr/testify/require" ) const ( - commandPort = 8981 - clientPermitWithoutStream = true clientTime = 50 * time.Second clientTimeout = 5 * time.Second @@ -27,10 +27,6 @@ const ( commonMultiplier = 0.2 reloadMonitoringPeriod = 400 * time.Millisecond - - randomPort1 = 1234 - randomPort2 = 4317 - randomPort3 = 1337 ) // Produces a populated Agent Config for testing usage. @@ -53,8 +49,9 @@ func AgentConfig() *config.Config { { Server: &config.ServerConfig{ Host: "127.0.0.1", - Port: randomPort1, + Port: 0, }, + Compression: "none", }, }, }, @@ -66,7 +63,18 @@ func AgentConfig() *config.Config { }, }, Receivers: config.Receivers{ - OtlpReceivers: OtlpReceivers(), + OtlpReceivers: []config.OtlpReceiver{ + { + Server: &config.ServerConfig{ + Host: "127.0.0.1", + Port: 0, + Type: 0, + }, + Auth: &config.AuthConfig{ + Token: "even-secreter-token", + }, + }, + }, HostMetrics: &config.HostMetrics{ CollectionInterval: time.Minute, InitialDelay: time.Second, @@ -82,8 +90,8 @@ func AgentConfig() *config.Config { Extensions: config.Extensions{ Health: &config.Health{ Server: &config.ServerConfig{ - Host: "localhost", - Port: randomPort3, + Host: "127.0.0.1", + Port: 0, Type: 0, }, }, @@ -105,7 +113,7 @@ func AgentConfig() *config.Config { Command: &config.Command{ Server: &config.ServerConfig{ Host: "127.0.0.1", - Port: commandPort, + Port: 0, Type: config.Grpc, }, Auth: &config.AuthConfig{ @@ -156,20 +164,21 @@ func OTelConfig(t *testing.T) *config.Config { ac := AgentConfig() ac.Collector.ConfigPath = filepath.Join(t.TempDir(), "otel-collector-config.yaml") - return ac -} + exporterPort, expErr := helpers.GetRandomPort(t) + require.NoError(t, expErr) + ac.Collector.Exporters.OtlpExporters[0].Server.Port = exporterPort -func OtlpReceivers() []config.OtlpReceiver { - return []config.OtlpReceiver{ - { - Server: &config.ServerConfig{ - Host: "localhost", - Port: randomPort2, - Type: 0, - }, - Auth: &config.AuthConfig{ - Token: "even-secreter-token", - }, - }, - } + receiverPort, recErr := helpers.GetRandomPort(t) + require.NoError(t, recErr) + ac.Collector.Receivers.OtlpReceivers[0].Server.Port = receiverPort + + healthPort, healthErr := helpers.GetRandomPort(t) + require.NoError(t, healthErr) + ac.Collector.Extensions.Health.Server.Port = healthPort + + commandPort, commandErr := helpers.GetRandomPort(t) + require.NoError(t, commandErr) + ac.Command.Server.Port = commandPort + + return ac }