diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d70db7d41..34ff72b517 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -307,34 +307,22 @@ jobs: if: ${{ success() && github.ref_name == 'v3'}} run: git push 'https://github-actions:${{ secrets.GITHUB_TOKEN }}@github.com/nginx/agent.git' benchmark-results:benchmark-results - publish-packages-vars: - name: Set workflow variables + publish-packages: + name: Publish NGINX Agent v3 packages if: ${{ github.ref_name == 'v3' && !github.event.pull_request.head.repo.fork }} - runs-on: ubuntu-22.04 - outputs: - package_build_num: ${{ steps.get_build_num.outputs.build_num }} - steps: - - name: Get the build number - id: get_build_num - run: echo "build_num=${{ github.run_number }}-$(echo ${{ github.sha }} | cut -c1-7)" >> $GITHUB_OUTPUT - -# publish-packages: -# name: Publish NGINX Agent v3 packages -# if: ${{ github.ref_name == 'v3' && -# !github.event.pull_request.head.repo.fork }} -# needs: [ lint, unit-test, performance-tests, -# load-tests, official-oss-image-integration-tests, -# official-plus-image-integration-tests, -# race-condition-test, publish-packages-vars ] -# uses: ./.github/workflows/release-branch.yml -# secrets: inherit -# permissions: -# id-token: write -# contents: read -# with: -# packageVersion: "3.0.0" -# packageBuildNo: "${{ needs.publish-packages-vars.outputs.package_build_num }}" -# uploadAzure: true -# publishPackages: true -# releaseBranch: "v3" + needs: [ lint, unit-test, performance-tests, + load-tests, official-oss-image-integration-tests, + official-plus-image-integration-tests, + race-condition-test ] + uses: ./.github/workflows/release-branch.yml + secrets: inherit + permissions: + id-token: write + contents: read + with: + packageVersion: "3.0.0" + packageBuildNo: "${{ github.run_number }}" + uploadAzure: true + publishPackages: true + releaseBranch: "v3" diff --git a/Makefile b/Makefile index 8307a677af..07761d857f 100644 --- a/Makefile +++ b/Makefile @@ -207,6 +207,11 @@ build-test-oss-image: --build-arg PACKAGES_REPO=$(OSS_PACKAGES_REPO) \ --build-arg BASE_IMAGE=$(BASE_IMAGE) \ --build-arg ENTRY_POINT=./test/docker/entrypoint.sh + +.PHONY: build-mock-collector-image +build-mock-collector-image: + $(CONTAINER_BUILDENV) $(CONTAINER_CLITOOL) build -t mock-collector . \ + --no-cache -f ./test/mock/collector/mock-collector/Dockerfile .PHONY: run-mock-management-otel-collector run-mock-management-otel-collector: ## Run mock management plane OTel collector diff --git a/api/grpc/mpi/v1/command.pb.go b/api/grpc/mpi/v1/command.pb.go index 76ea4a02fd..7f6e52f857 100644 --- a/api/grpc/mpi/v1/command.pb.go +++ b/api/grpc/mpi/v1/command.pb.go @@ -8,7 +8,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: mpi/v1/command.proto @@ -162,11 +162,9 @@ type CreateConnectionRequest struct { func (x *CreateConnectionRequest) Reset() { *x = CreateConnectionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateConnectionRequest) String() string { @@ -177,7 +175,7 @@ func (*CreateConnectionRequest) ProtoMessage() {} func (x *CreateConnectionRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -227,11 +225,9 @@ type Resource struct { func (x *Resource) Reset() { *x = Resource{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Resource) String() string { @@ -242,7 +238,7 @@ func (*Resource) ProtoMessage() {} func (x *Resource) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -326,11 +322,9 @@ type HostInfo struct { func (x *HostInfo) Reset() { *x = HostInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HostInfo) String() string { @@ -341,7 +335,7 @@ func (*HostInfo) ProtoMessage() {} func (x *HostInfo) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -397,11 +391,9 @@ type ReleaseInfo struct { func (x *ReleaseInfo) Reset() { *x = ReleaseInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReleaseInfo) String() string { @@ -412,7 +404,7 @@ func (*ReleaseInfo) ProtoMessage() {} func (x *ReleaseInfo) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -474,11 +466,9 @@ type ContainerInfo struct { func (x *ContainerInfo) Reset() { *x = ContainerInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ContainerInfo) String() string { @@ -489,7 +479,7 @@ func (*ContainerInfo) ProtoMessage() {} func (x *ContainerInfo) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -525,11 +515,9 @@ type CreateConnectionResponse struct { func (x *CreateConnectionResponse) Reset() { *x = CreateConnectionResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateConnectionResponse) String() string { @@ -540,7 +528,7 @@ func (*CreateConnectionResponse) ProtoMessage() {} func (x *CreateConnectionResponse) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -583,11 +571,9 @@ type UpdateDataPlaneStatusRequest struct { func (x *UpdateDataPlaneStatusRequest) Reset() { *x = UpdateDataPlaneStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateDataPlaneStatusRequest) String() string { @@ -598,7 +584,7 @@ func (*UpdateDataPlaneStatusRequest) ProtoMessage() {} func (x *UpdateDataPlaneStatusRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -636,11 +622,9 @@ type UpdateDataPlaneStatusResponse struct { func (x *UpdateDataPlaneStatusResponse) Reset() { *x = UpdateDataPlaneStatusResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateDataPlaneStatusResponse) String() string { @@ -651,7 +635,7 @@ func (*UpdateDataPlaneStatusResponse) ProtoMessage() {} func (x *UpdateDataPlaneStatusResponse) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -680,11 +664,9 @@ type InstanceHealth struct { func (x *InstanceHealth) Reset() { *x = InstanceHealth{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *InstanceHealth) String() string { @@ -695,7 +677,7 @@ func (*InstanceHealth) ProtoMessage() {} func (x *InstanceHealth) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -745,11 +727,9 @@ type UpdateDataPlaneHealthRequest struct { func (x *UpdateDataPlaneHealthRequest) Reset() { *x = UpdateDataPlaneHealthRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateDataPlaneHealthRequest) String() string { @@ -760,7 +740,7 @@ func (*UpdateDataPlaneHealthRequest) ProtoMessage() {} func (x *UpdateDataPlaneHealthRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -798,11 +778,9 @@ type UpdateDataPlaneHealthResponse struct { func (x *UpdateDataPlaneHealthResponse) Reset() { *x = UpdateDataPlaneHealthResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateDataPlaneHealthResponse) String() string { @@ -813,7 +791,7 @@ func (*UpdateDataPlaneHealthResponse) ProtoMessage() {} func (x *UpdateDataPlaneHealthResponse) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -844,11 +822,9 @@ type DataPlaneResponse struct { func (x *DataPlaneResponse) Reset() { *x = DataPlaneResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DataPlaneResponse) String() string { @@ -859,7 +835,7 @@ func (*DataPlaneResponse) ProtoMessage() {} func (x *DataPlaneResponse) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -916,11 +892,9 @@ type ManagementPlaneRequest struct { func (x *ManagementPlaneRequest) Reset() { *x = ManagementPlaneRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ManagementPlaneRequest) String() string { @@ -931,7 +905,7 @@ func (*ManagementPlaneRequest) ProtoMessage() {} func (x *ManagementPlaneRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1058,11 +1032,9 @@ type StatusRequest struct { func (x *StatusRequest) Reset() { *x = StatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StatusRequest) String() string { @@ -1073,7 +1045,7 @@ func (*StatusRequest) ProtoMessage() {} func (x *StatusRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1097,11 +1069,9 @@ type HealthRequest struct { func (x *HealthRequest) Reset() { *x = HealthRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HealthRequest) String() string { @@ -1112,7 +1082,7 @@ func (*HealthRequest) ProtoMessage() {} func (x *HealthRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1139,11 +1109,9 @@ type ConfigApplyRequest struct { func (x *ConfigApplyRequest) Reset() { *x = ConfigApplyRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ConfigApplyRequest) String() string { @@ -1154,7 +1122,7 @@ func (*ConfigApplyRequest) ProtoMessage() {} func (x *ConfigApplyRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1188,11 +1156,9 @@ type ConfigUploadRequest struct { func (x *ConfigUploadRequest) Reset() { *x = ConfigUploadRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ConfigUploadRequest) String() string { @@ -1203,7 +1169,7 @@ func (*ConfigUploadRequest) ProtoMessage() {} func (x *ConfigUploadRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1234,11 +1200,9 @@ type APIActionRequest struct { func (x *APIActionRequest) Reset() { *x = APIActionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *APIActionRequest) String() string { @@ -1249,7 +1213,7 @@ func (*APIActionRequest) ProtoMessage() {} func (x *APIActionRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1273,11 +1237,9 @@ type CommandStatusRequest struct { func (x *CommandStatusRequest) Reset() { *x = CommandStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CommandStatusRequest) String() string { @@ -1288,7 +1250,7 @@ func (*CommandStatusRequest) ProtoMessage() {} func (x *CommandStatusRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1319,11 +1281,9 @@ type Instance struct { func (x *Instance) Reset() { *x = Instance{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Instance) String() string { @@ -1334,7 +1294,7 @@ func (*Instance) ProtoMessage() {} func (x *Instance) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1386,11 +1346,9 @@ type InstanceMeta struct { func (x *InstanceMeta) Reset() { *x = InstanceMeta{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *InstanceMeta) String() string { @@ -1401,7 +1359,7 @@ func (*InstanceMeta) ProtoMessage() {} func (x *InstanceMeta) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1453,11 +1411,9 @@ type InstanceConfig struct { func (x *InstanceConfig) Reset() { *x = InstanceConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *InstanceConfig) String() string { @@ -1468,7 +1424,7 @@ func (*InstanceConfig) ProtoMessage() {} func (x *InstanceConfig) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1539,11 +1495,9 @@ type InstanceRuntime struct { func (x *InstanceRuntime) Reset() { *x = InstanceRuntime{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *InstanceRuntime) String() string { @@ -1554,7 +1508,7 @@ func (*InstanceRuntime) ProtoMessage() {} func (x *InstanceRuntime) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1647,11 +1601,9 @@ type InstanceChild struct { func (x *InstanceChild) Reset() { *x = InstanceChild{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *InstanceChild) String() string { @@ -1662,7 +1614,7 @@ func (*InstanceChild) ProtoMessage() {} func (x *InstanceChild) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1704,11 +1656,9 @@ type NGINXRuntimeInfo struct { func (x *NGINXRuntimeInfo) Reset() { *x = NGINXRuntimeInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *NGINXRuntimeInfo) String() string { @@ -1719,7 +1669,7 @@ func (*NGINXRuntimeInfo) ProtoMessage() {} func (x *NGINXRuntimeInfo) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1791,11 +1741,9 @@ type NGINXPlusRuntimeInfo struct { func (x *NGINXPlusRuntimeInfo) Reset() { *x = NGINXPlusRuntimeInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *NGINXPlusRuntimeInfo) String() string { @@ -1806,7 +1754,7 @@ func (*NGINXPlusRuntimeInfo) ProtoMessage() {} func (x *NGINXPlusRuntimeInfo) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1872,11 +1820,9 @@ type InstanceAction struct { func (x *InstanceAction) Reset() { *x = InstanceAction{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *InstanceAction) String() string { @@ -1887,7 +1833,7 @@ func (*InstanceAction) ProtoMessage() {} func (x *InstanceAction) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1924,11 +1870,9 @@ type AgentConfig struct { func (x *AgentConfig) Reset() { *x = AgentConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AgentConfig) String() string { @@ -1939,7 +1883,7 @@ func (*AgentConfig) ProtoMessage() {} func (x *AgentConfig) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2005,11 +1949,9 @@ type CommandServer struct { func (x *CommandServer) Reset() { *x = CommandServer{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CommandServer) String() string { @@ -2020,7 +1962,7 @@ func (*CommandServer) ProtoMessage() {} func (x *CommandServer) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2044,11 +1986,9 @@ type MetricsServer struct { func (x *MetricsServer) Reset() { *x = MetricsServer{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MetricsServer) String() string { @@ -2059,7 +1999,7 @@ func (*MetricsServer) ProtoMessage() {} func (x *MetricsServer) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2083,11 +2023,9 @@ type FileServer struct { func (x *FileServer) Reset() { *x = FileServer{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_command_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_command_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FileServer) String() string { @@ -2098,7 +2036,7 @@ func (*FileServer) ProtoMessage() {} func (x *FileServer) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_command_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2555,380 +2493,6 @@ func file_mpi_v1_command_proto_init() { } file_mpi_v1_common_proto_init() file_mpi_v1_files_proto_init() - if !protoimpl.UnsafeEnabled { - file_mpi_v1_command_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*CreateConnectionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Resource); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*HostInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*ReleaseInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*ContainerInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*CreateConnectionResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*UpdateDataPlaneStatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*UpdateDataPlaneStatusResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*InstanceHealth); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*UpdateDataPlaneHealthRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*UpdateDataPlaneHealthResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*DataPlaneResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*ManagementPlaneRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*StatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*HealthRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[15].Exporter = func(v any, i int) any { - switch v := v.(*ConfigApplyRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[16].Exporter = func(v any, i int) any { - switch v := v.(*ConfigUploadRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[17].Exporter = func(v any, i int) any { - switch v := v.(*APIActionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[18].Exporter = func(v any, i int) any { - switch v := v.(*CommandStatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[19].Exporter = func(v any, i int) any { - switch v := v.(*Instance); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[20].Exporter = func(v any, i int) any { - switch v := v.(*InstanceMeta); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[21].Exporter = func(v any, i int) any { - switch v := v.(*InstanceConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[22].Exporter = func(v any, i int) any { - switch v := v.(*InstanceRuntime); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[23].Exporter = func(v any, i int) any { - switch v := v.(*InstanceChild); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[24].Exporter = func(v any, i int) any { - switch v := v.(*NGINXRuntimeInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[25].Exporter = func(v any, i int) any { - switch v := v.(*NGINXPlusRuntimeInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[26].Exporter = func(v any, i int) any { - switch v := v.(*InstanceAction); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[27].Exporter = func(v any, i int) any { - switch v := v.(*AgentConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[28].Exporter = func(v any, i int) any { - switch v := v.(*CommandServer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[29].Exporter = func(v any, i int) any { - switch v := v.(*MetricsServer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_command_proto_msgTypes[30].Exporter = func(v any, i int) any { - switch v := v.(*FileServer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } file_mpi_v1_command_proto_msgTypes[1].OneofWrappers = []any{ (*Resource_HostInfo)(nil), (*Resource_ContainerInfo)(nil), diff --git a/api/grpc/mpi/v1/common.pb.go b/api/grpc/mpi/v1/common.pb.go index ca47776c11..3d71214d35 100644 --- a/api/grpc/mpi/v1/common.pb.go +++ b/api/grpc/mpi/v1/common.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: mpi/v1/common.proto @@ -104,11 +104,9 @@ type MessageMeta struct { func (x *MessageMeta) Reset() { *x = MessageMeta{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_common_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_common_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MessageMeta) String() string { @@ -119,7 +117,7 @@ func (*MessageMeta) ProtoMessage() {} func (x *MessageMeta) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_common_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -171,11 +169,9 @@ type CommandResponse struct { func (x *CommandResponse) Reset() { *x = CommandResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_common_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_common_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CommandResponse) String() string { @@ -186,7 +182,7 @@ func (*CommandResponse) ProtoMessage() {} func (x *CommandResponse) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_common_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -296,32 +292,6 @@ func file_mpi_v1_common_proto_init() { if File_mpi_v1_common_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_mpi_v1_common_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*MessageMeta); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_common_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*CommandResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/grpc/mpi/v1/files.pb.go b/api/grpc/mpi/v1/files.pb.go index a9d6743ecd..bb2a47f361 100644 --- a/api/grpc/mpi/v1/files.pb.go +++ b/api/grpc/mpi/v1/files.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: mpi/v1/files.proto @@ -27,6 +27,115 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// Enum to represent the possible signature algorithms used for certificates +type SignatureAlgorithm int32 + +const ( + // Default, unknown or unsupported algorithm + SignatureAlgorithm_SIGNATURE_ALGORITHM_UNKNOWN SignatureAlgorithm = 0 + // MD2 with RSA (Unsupported) + SignatureAlgorithm_MD2_WITH_RSA SignatureAlgorithm = 1 + // MD5 with RSA (Only supported for signing, not verification) + SignatureAlgorithm_MD5_WITH_RSA SignatureAlgorithm = 2 + // SHA-1 with RSA (Only supported for signing and for verification of CRLs, CSRs, and OCSP responses) + SignatureAlgorithm_SHA1_WITH_RSA SignatureAlgorithm = 3 + // SHA-256 with RSA + SignatureAlgorithm_SHA256_WITH_RSA SignatureAlgorithm = 4 + // SHA-384 with RSA + SignatureAlgorithm_SHA384_WITH_RSA SignatureAlgorithm = 5 + // SHA-512 with RSA + SignatureAlgorithm_SHA512_WITH_RSA SignatureAlgorithm = 6 + // DSA with SHA-1 (Unsupported) + SignatureAlgorithm_DSA_WITH_SHA1 SignatureAlgorithm = 7 + // DSA with SHA-256 (Unsupported) + SignatureAlgorithm_DSA_WITH_SHA256 SignatureAlgorithm = 8 + // ECDSA with SHA-1 (Only supported for signing and for verification of CRLs, CSRs, and OCSP responses) + SignatureAlgorithm_ECDSA_WITH_SHA1 SignatureAlgorithm = 9 + // ECDSA with SHA-256 + SignatureAlgorithm_ECDSA_WITH_SHA256 SignatureAlgorithm = 10 + // ECDSA with SHA-384 + SignatureAlgorithm_ECDSA_WITH_SHA384 SignatureAlgorithm = 11 + // ECDSA with SHA-512 + SignatureAlgorithm_ECDSA_WITH_SHA512 SignatureAlgorithm = 12 + // SHA-256 with RSA-PSS + SignatureAlgorithm_SHA256_WITH_RSA_PSS SignatureAlgorithm = 13 + // SHA-384 with RSA-PSS + SignatureAlgorithm_SHA384_WITH_RSA_PSS SignatureAlgorithm = 14 + // SHA-512 with RSA-PSS + SignatureAlgorithm_SHA512_WITH_RSA_PSS SignatureAlgorithm = 15 + // Pure Ed25519 + SignatureAlgorithm_PURE_ED25519 SignatureAlgorithm = 16 +) + +// Enum value maps for SignatureAlgorithm. +var ( + SignatureAlgorithm_name = map[int32]string{ + 0: "SIGNATURE_ALGORITHM_UNKNOWN", + 1: "MD2_WITH_RSA", + 2: "MD5_WITH_RSA", + 3: "SHA1_WITH_RSA", + 4: "SHA256_WITH_RSA", + 5: "SHA384_WITH_RSA", + 6: "SHA512_WITH_RSA", + 7: "DSA_WITH_SHA1", + 8: "DSA_WITH_SHA256", + 9: "ECDSA_WITH_SHA1", + 10: "ECDSA_WITH_SHA256", + 11: "ECDSA_WITH_SHA384", + 12: "ECDSA_WITH_SHA512", + 13: "SHA256_WITH_RSA_PSS", + 14: "SHA384_WITH_RSA_PSS", + 15: "SHA512_WITH_RSA_PSS", + 16: "PURE_ED25519", + } + SignatureAlgorithm_value = map[string]int32{ + "SIGNATURE_ALGORITHM_UNKNOWN": 0, + "MD2_WITH_RSA": 1, + "MD5_WITH_RSA": 2, + "SHA1_WITH_RSA": 3, + "SHA256_WITH_RSA": 4, + "SHA384_WITH_RSA": 5, + "SHA512_WITH_RSA": 6, + "DSA_WITH_SHA1": 7, + "DSA_WITH_SHA256": 8, + "ECDSA_WITH_SHA1": 9, + "ECDSA_WITH_SHA256": 10, + "ECDSA_WITH_SHA384": 11, + "ECDSA_WITH_SHA512": 12, + "SHA256_WITH_RSA_PSS": 13, + "SHA384_WITH_RSA_PSS": 14, + "SHA512_WITH_RSA_PSS": 15, + "PURE_ED25519": 16, + } +) + +func (x SignatureAlgorithm) Enum() *SignatureAlgorithm { + p := new(SignatureAlgorithm) + *p = x + return p +} + +func (x SignatureAlgorithm) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SignatureAlgorithm) Descriptor() protoreflect.EnumDescriptor { + return file_mpi_v1_files_proto_enumTypes[0].Descriptor() +} + +func (SignatureAlgorithm) Type() protoreflect.EnumType { + return &file_mpi_v1_files_proto_enumTypes[0] +} + +func (x SignatureAlgorithm) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SignatureAlgorithm.Descriptor instead. +func (SignatureAlgorithm) EnumDescriptor() ([]byte, []int) { + return file_mpi_v1_files_proto_rawDescGZIP(), []int{0} +} + // Action enumeration type File_FileAction int32 @@ -72,11 +181,11 @@ func (x File_FileAction) String() string { } func (File_FileAction) Descriptor() protoreflect.EnumDescriptor { - return file_mpi_v1_files_proto_enumTypes[0].Descriptor() + return file_mpi_v1_files_proto_enumTypes[1].Descriptor() } func (File_FileAction) Type() protoreflect.EnumType { - return &file_mpi_v1_files_proto_enumTypes[0] + return &file_mpi_v1_files_proto_enumTypes[1] } func (x File_FileAction) Number() protoreflect.EnumNumber { @@ -102,11 +211,9 @@ type GetOverviewRequest struct { func (x *GetOverviewRequest) Reset() { *x = GetOverviewRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetOverviewRequest) String() string { @@ -117,7 +224,7 @@ func (*GetOverviewRequest) ProtoMessage() {} func (x *GetOverviewRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -158,11 +265,9 @@ type GetOverviewResponse struct { func (x *GetOverviewResponse) Reset() { *x = GetOverviewResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetOverviewResponse) String() string { @@ -173,7 +278,7 @@ func (*GetOverviewResponse) ProtoMessage() {} func (x *GetOverviewResponse) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -209,11 +314,9 @@ type UpdateOverviewRequest struct { func (x *UpdateOverviewRequest) Reset() { *x = UpdateOverviewRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateOverviewRequest) String() string { @@ -224,7 +327,7 @@ func (*UpdateOverviewRequest) ProtoMessage() {} func (x *UpdateOverviewRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -262,11 +365,9 @@ type UpdateOverviewResponse struct { func (x *UpdateOverviewResponse) Reset() { *x = UpdateOverviewResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateOverviewResponse) String() string { @@ -277,7 +378,7 @@ func (*UpdateOverviewResponse) ProtoMessage() {} func (x *UpdateOverviewResponse) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -306,11 +407,9 @@ type ConfigVersion struct { func (x *ConfigVersion) Reset() { *x = ConfigVersion{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ConfigVersion) String() string { @@ -321,7 +420,7 @@ func (*ConfigVersion) ProtoMessage() {} func (x *ConfigVersion) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -364,11 +463,9 @@ type FileOverview struct { func (x *FileOverview) Reset() { *x = FileOverview{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FileOverview) String() string { @@ -379,7 +476,7 @@ func (*FileOverview) ProtoMessage() {} func (x *FileOverview) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -422,11 +519,9 @@ type File struct { func (x *File) Reset() { *x = File{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *File) String() string { @@ -437,7 +532,7 @@ func (*File) ProtoMessage() {} func (x *File) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -480,11 +575,9 @@ type GetFileRequest struct { func (x *GetFileRequest) Reset() { *x = GetFileRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetFileRequest) String() string { @@ -495,7 +588,7 @@ func (*GetFileRequest) ProtoMessage() {} func (x *GetFileRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -536,11 +629,9 @@ type GetFileResponse struct { func (x *GetFileResponse) Reset() { *x = GetFileResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetFileResponse) String() string { @@ -551,7 +642,7 @@ func (*GetFileResponse) ProtoMessage() {} func (x *GetFileResponse) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -585,11 +676,9 @@ type FileContents struct { func (x *FileContents) Reset() { *x = FileContents{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FileContents) String() string { @@ -600,7 +689,7 @@ func (*FileContents) ProtoMessage() {} func (x *FileContents) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -638,15 +727,19 @@ type FileMeta struct { Permissions string `protobuf:"bytes,4,opt,name=permissions,proto3" json:"permissions,omitempty"` // The size of the file in bytes Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` + // additional file information + // + // Types that are assignable to FileType: + // + // *FileMeta_CertificateMeta + FileType isFileMeta_FileType `protobuf_oneof:"file_type"` } func (x *FileMeta) Reset() { *x = FileMeta{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FileMeta) String() string { @@ -657,7 +750,7 @@ func (*FileMeta) ProtoMessage() {} func (x *FileMeta) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -707,6 +800,30 @@ func (x *FileMeta) GetSize() int64 { return 0 } +func (m *FileMeta) GetFileType() isFileMeta_FileType { + if m != nil { + return m.FileType + } + return nil +} + +func (x *FileMeta) GetCertificateMeta() *CertificateMeta { + if x, ok := x.GetFileType().(*FileMeta_CertificateMeta); ok { + return x.CertificateMeta + } + return nil +} + +type isFileMeta_FileType interface { + isFileMeta_FileType() +} + +type FileMeta_CertificateMeta struct { + CertificateMeta *CertificateMeta `protobuf:"bytes,6,opt,name=certificate_meta,json=certificateMeta,proto3,oneof"` +} + +func (*FileMeta_CertificateMeta) isFileMeta_FileType() {} + // Represents the update file request type UpdateFileRequest struct { state protoimpl.MessageState @@ -723,11 +840,9 @@ type UpdateFileRequest struct { func (x *UpdateFileRequest) Reset() { *x = UpdateFileRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateFileRequest) String() string { @@ -738,7 +853,7 @@ func (*UpdateFileRequest) ProtoMessage() {} func (x *UpdateFileRequest) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -786,11 +901,9 @@ type UpdateFileResponse struct { func (x *UpdateFileResponse) Reset() { *x = UpdateFileResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mpi_v1_files_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_mpi_v1_files_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateFileResponse) String() string { @@ -801,7 +914,7 @@ func (*UpdateFileResponse) ProtoMessage() {} func (x *UpdateFileResponse) ProtoReflect() protoreflect.Message { mi := &file_mpi_v1_files_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -823,6 +936,220 @@ func (x *UpdateFileResponse) GetFileMeta() *FileMeta { return nil } +// Define the certificate message based on https://pkg.go.dev/crypto/x509#Certificate +// and https://github.com/googleapis/googleapis/blob/005df4681b89bd204a90b76168a6dc9d9e7bf4fe/google/cloud/iot/v1/resources.proto#L341 +type CertificateMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Serial number of the certificate, usually a unique identifier, RFC5280 states the upper limit for serial number is 20 octets + SerialNumber []byte `protobuf:"bytes,1,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"` + // Issuer details (who issued the certificate) + Issuer string `protobuf:"bytes,2,opt,name=issuer,proto3" json:"issuer,omitempty"` + // Subject details (to whom the certificate is issued) + Subject string `protobuf:"bytes,3,opt,name=subject,proto3" json:"subject,omitempty"` + // Subject Alternative Names (SAN) including DNS names and IP addresses + Sans *SubjectAlternativeNames `protobuf:"bytes,4,opt,name=sans,proto3" json:"sans,omitempty"` + // Timestamps representing the start of certificate validity (Not Before, Not After) + Dates *CertificateDates `protobuf:"bytes,5,opt,name=dates,proto3" json:"dates,omitempty"` + // The algorithm used to sign the certificate (e.g., SHA256-RSA) + SignatureAlgorithm SignatureAlgorithm `protobuf:"varint,6,opt,name=signature_algorithm,json=signatureAlgorithm,proto3,enum=mpi.v1.SignatureAlgorithm" json:"signature_algorithm,omitempty"` + // The type of public key in the certificate. + PublicKeyAlgorithm string `protobuf:"bytes,7,opt,name=public_key_algorithm,json=publicKeyAlgorithm,proto3" json:"public_key_algorithm,omitempty"` +} + +func (x *CertificateMeta) Reset() { + *x = CertificateMeta{} + mi := &file_mpi_v1_files_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CertificateMeta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CertificateMeta) ProtoMessage() {} + +func (x *CertificateMeta) ProtoReflect() protoreflect.Message { + mi := &file_mpi_v1_files_proto_msgTypes[13] + 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 CertificateMeta.ProtoReflect.Descriptor instead. +func (*CertificateMeta) Descriptor() ([]byte, []int) { + return file_mpi_v1_files_proto_rawDescGZIP(), []int{13} +} + +func (x *CertificateMeta) GetSerialNumber() []byte { + if x != nil { + return x.SerialNumber + } + return nil +} + +func (x *CertificateMeta) GetIssuer() string { + if x != nil { + return x.Issuer + } + return "" +} + +func (x *CertificateMeta) GetSubject() string { + if x != nil { + return x.Subject + } + return "" +} + +func (x *CertificateMeta) GetSans() *SubjectAlternativeNames { + if x != nil { + return x.Sans + } + return nil +} + +func (x *CertificateMeta) GetDates() *CertificateDates { + if x != nil { + return x.Dates + } + return nil +} + +func (x *CertificateMeta) GetSignatureAlgorithm() SignatureAlgorithm { + if x != nil { + return x.SignatureAlgorithm + } + return SignatureAlgorithm_SIGNATURE_ALGORITHM_UNKNOWN +} + +func (x *CertificateMeta) GetPublicKeyAlgorithm() string { + if x != nil { + return x.PublicKeyAlgorithm + } + return "" +} + +// Represents the dates for which a certificate is valid +type CertificateDates struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The start date that for when the certificate is valid + NotBefore int64 `protobuf:"varint,1,opt,name=not_before,json=notBefore,proto3" json:"not_before,omitempty"` + // The end date that for when the certificate is valid + NotAfter int64 `protobuf:"varint,2,opt,name=not_after,json=notAfter,proto3" json:"not_after,omitempty"` +} + +func (x *CertificateDates) Reset() { + *x = CertificateDates{} + mi := &file_mpi_v1_files_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CertificateDates) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CertificateDates) ProtoMessage() {} + +func (x *CertificateDates) ProtoReflect() protoreflect.Message { + mi := &file_mpi_v1_files_proto_msgTypes[14] + 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 CertificateDates.ProtoReflect.Descriptor instead. +func (*CertificateDates) Descriptor() ([]byte, []int) { + return file_mpi_v1_files_proto_rawDescGZIP(), []int{14} +} + +func (x *CertificateDates) GetNotBefore() int64 { + if x != nil { + return x.NotBefore + } + return 0 +} + +func (x *CertificateDates) GetNotAfter() int64 { + if x != nil { + return x.NotAfter + } + return 0 +} + +// Represents the Subject Alternative Names for a certificate +type SubjectAlternativeNames struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // List of DNS names in the Subject Alternative Name (SAN) extension + DnsNames []string `protobuf:"bytes,1,rep,name=dns_names,json=dnsNames,proto3" json:"dns_names,omitempty"` + // List of ip addresses in the SAN extension + IpAddresses []string `protobuf:"bytes,2,rep,name=ip_addresses,json=ipAddresses,proto3" json:"ip_addresses,omitempty"` +} + +func (x *SubjectAlternativeNames) Reset() { + *x = SubjectAlternativeNames{} + mi := &file_mpi_v1_files_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SubjectAlternativeNames) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubjectAlternativeNames) ProtoMessage() {} + +func (x *SubjectAlternativeNames) ProtoReflect() protoreflect.Message { + mi := &file_mpi_v1_files_proto_msgTypes[15] + 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 SubjectAlternativeNames.ProtoReflect.Descriptor instead. +func (*SubjectAlternativeNames) Descriptor() ([]byte, []int) { + return file_mpi_v1_files_proto_rawDescGZIP(), []int{15} +} + +func (x *SubjectAlternativeNames) GetDnsNames() []string { + if x != nil { + return x.DnsNames + } + return nil +} + +func (x *SubjectAlternativeNames) GetIpAddresses() []string { + if x != nil { + return x.IpAddresses + } + return nil +} + var File_mpi_v1_files_proto protoreflect.FileDescriptor var file_mpi_v1_files_proto_rawDesc = []byte{ @@ -899,7 +1226,7 @@ var file_mpi_v1_files_proto_rawDesc = []byte{ 0x65, 0x6e, 0x74, 0x73, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x08, 0x46, + 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa2, 0x02, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0x3a, 0x01, 0x2f, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, @@ -912,42 +1239,105 @@ var file_mpi_v1_files_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x10, 0xba, 0x48, 0x0d, 0x72, 0x0b, 0x32, 0x09, 0x30, 0x5b, 0x30, 0x2d, 0x37, 0x5d, 0x7b, 0x33, 0x7d, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x9f, 0x01, 0x0a, - 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x08, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x43, - 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4d, - 0x65, 0x74, 0x61, 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, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x10, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x48, + 0x00, 0x52, 0x0f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x42, 0x0b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x9f, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x0c, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x22, 0x43, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6d, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xe9, 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, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x06, 0x69, 0x73, + 0x73, 0x75, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x07, 0x73, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x33, + 0x0a, 0x04, 0x73, 0x61, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x04, 0x73, + 0x61, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x6d, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x52, 0x12, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, + 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, + 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, + 0x68, 0x6d, 0x22, 0x4e, 0x0a, 0x10, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x74, 0x5f, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6e, 0x6f, 0x74, 0x42, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x5f, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x6f, 0x74, 0x41, 0x66, 0x74, + 0x65, 0x72, 0x22, 0x59, 0x0a, 0x17, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x64, 0x6e, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 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, 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, 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 ( @@ -962,57 +1352,65 @@ func file_mpi_v1_files_proto_rawDescGZIP() []byte { return file_mpi_v1_files_proto_rawDescData } -var file_mpi_v1_files_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_mpi_v1_files_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_mpi_v1_files_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_mpi_v1_files_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_mpi_v1_files_proto_goTypes = []any{ - (File_FileAction)(0), // 0: mpi.v1.File.FileAction - (*GetOverviewRequest)(nil), // 1: mpi.v1.GetOverviewRequest - (*GetOverviewResponse)(nil), // 2: mpi.v1.GetOverviewResponse - (*UpdateOverviewRequest)(nil), // 3: mpi.v1.UpdateOverviewRequest - (*UpdateOverviewResponse)(nil), // 4: mpi.v1.UpdateOverviewResponse - (*ConfigVersion)(nil), // 5: mpi.v1.ConfigVersion - (*FileOverview)(nil), // 6: mpi.v1.FileOverview - (*File)(nil), // 7: mpi.v1.File - (*GetFileRequest)(nil), // 8: mpi.v1.GetFileRequest - (*GetFileResponse)(nil), // 9: mpi.v1.GetFileResponse - (*FileContents)(nil), // 10: mpi.v1.FileContents - (*FileMeta)(nil), // 11: mpi.v1.FileMeta - (*UpdateFileRequest)(nil), // 12: mpi.v1.UpdateFileRequest - (*UpdateFileResponse)(nil), // 13: mpi.v1.UpdateFileResponse - (*MessageMeta)(nil), // 14: mpi.v1.MessageMeta - (*timestamppb.Timestamp)(nil), // 15: google.protobuf.Timestamp + (SignatureAlgorithm)(0), // 0: mpi.v1.SignatureAlgorithm + (File_FileAction)(0), // 1: mpi.v1.File.FileAction + (*GetOverviewRequest)(nil), // 2: mpi.v1.GetOverviewRequest + (*GetOverviewResponse)(nil), // 3: mpi.v1.GetOverviewResponse + (*UpdateOverviewRequest)(nil), // 4: mpi.v1.UpdateOverviewRequest + (*UpdateOverviewResponse)(nil), // 5: mpi.v1.UpdateOverviewResponse + (*ConfigVersion)(nil), // 6: mpi.v1.ConfigVersion + (*FileOverview)(nil), // 7: mpi.v1.FileOverview + (*File)(nil), // 8: mpi.v1.File + (*GetFileRequest)(nil), // 9: mpi.v1.GetFileRequest + (*GetFileResponse)(nil), // 10: mpi.v1.GetFileResponse + (*FileContents)(nil), // 11: mpi.v1.FileContents + (*FileMeta)(nil), // 12: mpi.v1.FileMeta + (*UpdateFileRequest)(nil), // 13: mpi.v1.UpdateFileRequest + (*UpdateFileResponse)(nil), // 14: mpi.v1.UpdateFileResponse + (*CertificateMeta)(nil), // 15: mpi.v1.CertificateMeta + (*CertificateDates)(nil), // 16: mpi.v1.CertificateDates + (*SubjectAlternativeNames)(nil), // 17: mpi.v1.SubjectAlternativeNames + (*MessageMeta)(nil), // 18: mpi.v1.MessageMeta + (*timestamppb.Timestamp)(nil), // 19: google.protobuf.Timestamp } var file_mpi_v1_files_proto_depIdxs = []int32{ - 14, // 0: mpi.v1.GetOverviewRequest.message_meta:type_name -> mpi.v1.MessageMeta - 5, // 1: mpi.v1.GetOverviewRequest.config_version:type_name -> mpi.v1.ConfigVersion - 6, // 2: mpi.v1.GetOverviewResponse.overview:type_name -> mpi.v1.FileOverview - 14, // 3: mpi.v1.UpdateOverviewRequest.message_meta:type_name -> mpi.v1.MessageMeta - 6, // 4: mpi.v1.UpdateOverviewRequest.overview:type_name -> mpi.v1.FileOverview - 7, // 5: mpi.v1.FileOverview.files:type_name -> mpi.v1.File - 5, // 6: mpi.v1.FileOverview.config_version:type_name -> mpi.v1.ConfigVersion - 11, // 7: mpi.v1.File.file_meta:type_name -> mpi.v1.FileMeta - 0, // 8: mpi.v1.File.action:type_name -> mpi.v1.File.FileAction - 14, // 9: mpi.v1.GetFileRequest.message_meta:type_name -> mpi.v1.MessageMeta - 11, // 10: mpi.v1.GetFileRequest.file_meta:type_name -> mpi.v1.FileMeta - 10, // 11: mpi.v1.GetFileResponse.contents:type_name -> mpi.v1.FileContents - 15, // 12: mpi.v1.FileMeta.modified_time:type_name -> google.protobuf.Timestamp - 7, // 13: mpi.v1.UpdateFileRequest.file:type_name -> mpi.v1.File - 10, // 14: mpi.v1.UpdateFileRequest.contents:type_name -> mpi.v1.FileContents - 14, // 15: mpi.v1.UpdateFileRequest.message_meta:type_name -> mpi.v1.MessageMeta - 11, // 16: mpi.v1.UpdateFileResponse.file_meta:type_name -> mpi.v1.FileMeta - 1, // 17: mpi.v1.FileService.GetOverview:input_type -> mpi.v1.GetOverviewRequest - 3, // 18: mpi.v1.FileService.UpdateOverview:input_type -> mpi.v1.UpdateOverviewRequest - 8, // 19: mpi.v1.FileService.GetFile:input_type -> mpi.v1.GetFileRequest - 12, // 20: mpi.v1.FileService.UpdateFile:input_type -> mpi.v1.UpdateFileRequest - 2, // 21: mpi.v1.FileService.GetOverview:output_type -> mpi.v1.GetOverviewResponse - 4, // 22: mpi.v1.FileService.UpdateOverview:output_type -> mpi.v1.UpdateOverviewResponse - 9, // 23: mpi.v1.FileService.GetFile:output_type -> mpi.v1.GetFileResponse - 13, // 24: mpi.v1.FileService.UpdateFile:output_type -> mpi.v1.UpdateFileResponse - 21, // [21:25] is the sub-list for method output_type - 17, // [17:21] is the sub-list for method input_type - 17, // [17:17] is the sub-list for extension type_name - 17, // [17:17] is the sub-list for extension extendee - 0, // [0:17] is the sub-list for field type_name + 18, // 0: mpi.v1.GetOverviewRequest.message_meta:type_name -> mpi.v1.MessageMeta + 6, // 1: mpi.v1.GetOverviewRequest.config_version:type_name -> mpi.v1.ConfigVersion + 7, // 2: mpi.v1.GetOverviewResponse.overview:type_name -> mpi.v1.FileOverview + 18, // 3: mpi.v1.UpdateOverviewRequest.message_meta:type_name -> mpi.v1.MessageMeta + 7, // 4: mpi.v1.UpdateOverviewRequest.overview:type_name -> mpi.v1.FileOverview + 8, // 5: mpi.v1.FileOverview.files:type_name -> mpi.v1.File + 6, // 6: mpi.v1.FileOverview.config_version:type_name -> mpi.v1.ConfigVersion + 12, // 7: mpi.v1.File.file_meta:type_name -> mpi.v1.FileMeta + 1, // 8: mpi.v1.File.action:type_name -> mpi.v1.File.FileAction + 18, // 9: mpi.v1.GetFileRequest.message_meta:type_name -> mpi.v1.MessageMeta + 12, // 10: mpi.v1.GetFileRequest.file_meta:type_name -> mpi.v1.FileMeta + 11, // 11: mpi.v1.GetFileResponse.contents:type_name -> mpi.v1.FileContents + 19, // 12: mpi.v1.FileMeta.modified_time:type_name -> google.protobuf.Timestamp + 15, // 13: mpi.v1.FileMeta.certificate_meta:type_name -> mpi.v1.CertificateMeta + 8, // 14: mpi.v1.UpdateFileRequest.file:type_name -> mpi.v1.File + 11, // 15: mpi.v1.UpdateFileRequest.contents:type_name -> mpi.v1.FileContents + 18, // 16: mpi.v1.UpdateFileRequest.message_meta:type_name -> mpi.v1.MessageMeta + 12, // 17: mpi.v1.UpdateFileResponse.file_meta:type_name -> mpi.v1.FileMeta + 17, // 18: mpi.v1.CertificateMeta.sans:type_name -> mpi.v1.SubjectAlternativeNames + 16, // 19: mpi.v1.CertificateMeta.dates:type_name -> mpi.v1.CertificateDates + 0, // 20: mpi.v1.CertificateMeta.signature_algorithm:type_name -> mpi.v1.SignatureAlgorithm + 2, // 21: mpi.v1.FileService.GetOverview:input_type -> mpi.v1.GetOverviewRequest + 4, // 22: mpi.v1.FileService.UpdateOverview:input_type -> mpi.v1.UpdateOverviewRequest + 9, // 23: mpi.v1.FileService.GetFile:input_type -> mpi.v1.GetFileRequest + 13, // 24: mpi.v1.FileService.UpdateFile:input_type -> mpi.v1.UpdateFileRequest + 3, // 25: mpi.v1.FileService.GetOverview:output_type -> mpi.v1.GetOverviewResponse + 5, // 26: mpi.v1.FileService.UpdateOverview:output_type -> mpi.v1.UpdateOverviewResponse + 10, // 27: mpi.v1.FileService.GetFile:output_type -> mpi.v1.GetFileResponse + 14, // 28: mpi.v1.FileService.UpdateFile:output_type -> mpi.v1.UpdateFileResponse + 25, // [25:29] is the sub-list for method output_type + 21, // [21:25] is the sub-list for method input_type + 21, // [21:21] is the sub-list for extension type_name + 21, // [21:21] is the sub-list for extension extendee + 0, // [0:21] is the sub-list for field type_name } func init() { file_mpi_v1_files_proto_init() } @@ -1021,172 +1419,17 @@ func file_mpi_v1_files_proto_init() { return } file_mpi_v1_common_proto_init() - if !protoimpl.UnsafeEnabled { - file_mpi_v1_files_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*GetOverviewRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*GetOverviewResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*UpdateOverviewRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*UpdateOverviewResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*ConfigVersion); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*FileOverview); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*File); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*GetFileRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*GetFileResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*FileContents); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*FileMeta); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*UpdateFileRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mpi_v1_files_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*UpdateFileResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } file_mpi_v1_files_proto_msgTypes[6].OneofWrappers = []any{} + file_mpi_v1_files_proto_msgTypes[10].OneofWrappers = []any{ + (*FileMeta_CertificateMeta)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mpi_v1_files_proto_rawDesc, - NumEnums: 1, - NumMessages: 13, + NumEnums: 2, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/api/grpc/mpi/v1/files.pb.validate.go b/api/grpc/mpi/v1/files.pb.validate.go index 1408956917..38ee78b14c 100644 --- a/api/grpc/mpi/v1/files.pb.validate.go +++ b/api/grpc/mpi/v1/files.pb.validate.go @@ -1432,6 +1432,52 @@ func (m *FileMeta) validate(all bool) error { // no validation rules for Size + switch v := m.FileType.(type) { + case *FileMeta_CertificateMeta: + if v == nil { + err := FileMetaValidationError{ + field: "FileType", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetCertificateMeta()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, FileMetaValidationError{ + field: "CertificateMeta", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, FileMetaValidationError{ + field: "CertificateMeta", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetCertificateMeta()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return FileMetaValidationError{ + field: "CertificateMeta", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + _ = v // ensures v is used + } + if len(errors) > 0 { return FileMetaMultiError(errors) } @@ -1828,3 +1874,377 @@ var _ interface { Cause() error ErrorName() string } = UpdateFileResponseValidationError{} + +// Validate checks the field values on CertificateMeta 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 *CertificateMeta) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on CertificateMeta 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 +// CertificateMetaMultiError, or nil if none found. +func (m *CertificateMeta) ValidateAll() error { + return m.validate(true) +} + +func (m *CertificateMeta) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for SerialNumber + + // no validation rules for Issuer + + // no validation rules for Subject + + if all { + switch v := interface{}(m.GetSans()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CertificateMetaValidationError{ + field: "Sans", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CertificateMetaValidationError{ + field: "Sans", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetSans()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CertificateMetaValidationError{ + field: "Sans", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetDates()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CertificateMetaValidationError{ + field: "Dates", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CertificateMetaValidationError{ + field: "Dates", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetDates()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CertificateMetaValidationError{ + field: "Dates", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for SignatureAlgorithm + + // no validation rules for PublicKeyAlgorithm + + if len(errors) > 0 { + return CertificateMetaMultiError(errors) + } + + return nil +} + +// CertificateMetaMultiError is an error wrapping multiple validation errors +// returned by CertificateMeta.ValidateAll() if the designated constraints +// aren't met. +type CertificateMetaMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m CertificateMetaMultiError) 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 CertificateMetaMultiError) AllErrors() []error { return m } + +// CertificateMetaValidationError is the validation error returned by +// CertificateMeta.Validate if the designated constraints aren't met. +type CertificateMetaValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e CertificateMetaValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e CertificateMetaValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e CertificateMetaValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e CertificateMetaValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e CertificateMetaValidationError) ErrorName() string { return "CertificateMetaValidationError" } + +// Error satisfies the builtin error interface +func (e CertificateMetaValidationError) 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 %sCertificateMeta.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = CertificateMetaValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = CertificateMetaValidationError{} + +// Validate checks the field values on CertificateDates 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 *CertificateDates) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on CertificateDates 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 +// CertificateDatesMultiError, or nil if none found. +func (m *CertificateDates) ValidateAll() error { + return m.validate(true) +} + +func (m *CertificateDates) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for NotBefore + + // no validation rules for NotAfter + + if len(errors) > 0 { + return CertificateDatesMultiError(errors) + } + + return nil +} + +// CertificateDatesMultiError is an error wrapping multiple validation errors +// returned by CertificateDates.ValidateAll() if the designated constraints +// aren't met. +type CertificateDatesMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m CertificateDatesMultiError) 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 CertificateDatesMultiError) AllErrors() []error { return m } + +// CertificateDatesValidationError is the validation error returned by +// CertificateDates.Validate if the designated constraints aren't met. +type CertificateDatesValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e CertificateDatesValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e CertificateDatesValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e CertificateDatesValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e CertificateDatesValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e CertificateDatesValidationError) ErrorName() string { return "CertificateDatesValidationError" } + +// Error satisfies the builtin error interface +func (e CertificateDatesValidationError) 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 %sCertificateDates.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = CertificateDatesValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = CertificateDatesValidationError{} + +// Validate checks the field values on SubjectAlternativeNames 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 *SubjectAlternativeNames) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SubjectAlternativeNames 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 +// SubjectAlternativeNamesMultiError, or nil if none found. +func (m *SubjectAlternativeNames) ValidateAll() error { + return m.validate(true) +} + +func (m *SubjectAlternativeNames) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return SubjectAlternativeNamesMultiError(errors) + } + + return nil +} + +// SubjectAlternativeNamesMultiError is an error wrapping multiple validation +// errors returned by SubjectAlternativeNames.ValidateAll() if the designated +// constraints aren't met. +type SubjectAlternativeNamesMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SubjectAlternativeNamesMultiError) 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 SubjectAlternativeNamesMultiError) AllErrors() []error { return m } + +// SubjectAlternativeNamesValidationError is the validation error returned by +// SubjectAlternativeNames.Validate if the designated constraints aren't met. +type SubjectAlternativeNamesValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SubjectAlternativeNamesValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SubjectAlternativeNamesValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SubjectAlternativeNamesValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SubjectAlternativeNamesValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SubjectAlternativeNamesValidationError) ErrorName() string { + return "SubjectAlternativeNamesValidationError" +} + +// Error satisfies the builtin error interface +func (e SubjectAlternativeNamesValidationError) 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 %sSubjectAlternativeNames.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SubjectAlternativeNamesValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SubjectAlternativeNamesValidationError{} diff --git a/api/grpc/mpi/v1/files.proto b/api/grpc/mpi/v1/files.proto index 909d5dcd3a..75c889b5c0 100644 --- a/api/grpc/mpi/v1/files.proto +++ b/api/grpc/mpi/v1/files.proto @@ -123,6 +123,10 @@ message FileMeta { string permissions = 4 [(buf.validate.field).string.pattern = "0[0-7]{3}"]; // The size of the file in bytes int64 size = 5; + // additional file information + oneof file_type { + CertificateMeta certificate_meta = 6; + } } // Represents the update file request @@ -140,3 +144,99 @@ message UpdateFileResponse { // Meta-information associated with the updated file FileMeta file_meta = 1; } + +// Define the certificate message based on https://pkg.go.dev/crypto/x509#Certificate +// 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]; + + // Issuer details (who issued the certificate) + string issuer = 2 [(buf.validate.field).string.min_len = 1]; + + // Subject details (to whom the certificate is issued) + string subject = 3 [(buf.validate.field).string.min_len = 1]; + + // Subject Alternative Names (SAN) including DNS names and IP addresses + SubjectAlternativeNames sans = 4; + + // Timestamps representing the start of certificate validity (Not Before, Not After) + CertificateDates dates = 5; + + // The algorithm used to sign the certificate (e.g., SHA256-RSA) + SignatureAlgorithm signature_algorithm = 6; + + // The type of public key in the certificate. + string public_key_algorithm = 7; +} + +// Represents the dates for which a certificate is valid +message CertificateDates { + // The start date that for when the certificate is valid + int64 not_before = 1; + // The end date that for when the certificate is valid + int64 not_after = 2; +} + +// Represents the Subject Alternative Names for a certificate +message SubjectAlternativeNames { + // List of DNS names in the Subject Alternative Name (SAN) extension + repeated string dns_names = 1; + + // List of ip addresses in the SAN extension + repeated string ip_addresses = 2; +} + +// Enum to represent the possible signature algorithms used for certificates +enum SignatureAlgorithm { + // Default, unknown or unsupported algorithm + SIGNATURE_ALGORITHM_UNKNOWN = 0; + + // MD2 with RSA (Unsupported) + MD2_WITH_RSA = 1; + + // MD5 with RSA (Only supported for signing, not verification) + MD5_WITH_RSA = 2; + + // SHA-1 with RSA (Only supported for signing and for verification of CRLs, CSRs, and OCSP responses) + SHA1_WITH_RSA = 3; + + // SHA-256 with RSA + SHA256_WITH_RSA = 4; + + // SHA-384 with RSA + SHA384_WITH_RSA = 5; + + // SHA-512 with RSA + SHA512_WITH_RSA = 6; + + // DSA with SHA-1 (Unsupported) + DSA_WITH_SHA1 = 7; + + // DSA with SHA-256 (Unsupported) + DSA_WITH_SHA256 = 8; + + // ECDSA with SHA-1 (Only supported for signing and for verification of CRLs, CSRs, and OCSP responses) + ECDSA_WITH_SHA1 = 9; + + // ECDSA with SHA-256 + ECDSA_WITH_SHA256 = 10; + + // ECDSA with SHA-384 + ECDSA_WITH_SHA384 = 11; + + // ECDSA with SHA-512 + ECDSA_WITH_SHA512 = 12; + + // SHA-256 with RSA-PSS + SHA256_WITH_RSA_PSS = 13; + + // SHA-384 with RSA-PSS + SHA384_WITH_RSA_PSS = 14; + + // SHA-512 with RSA-PSS + SHA512_WITH_RSA_PSS = 15; + + // Pure Ed25519 + PURE_ED25519 = 16; +} \ No newline at end of file diff --git a/docs/proto/protos.md b/docs/proto/protos.md index 46a4aa7467..398288d9a1 100644 --- a/docs/proto/protos.md +++ b/docs/proto/protos.md @@ -10,6 +10,8 @@ - [CommandResponse.CommandStatus](#mpi-v1-CommandResponse-CommandStatus) - [mpi/v1/files.proto](#mpi_v1_files-proto) + - [CertificateDates](#mpi-v1-CertificateDates) + - [CertificateMeta](#mpi-v1-CertificateMeta) - [ConfigVersion](#mpi-v1-ConfigVersion) - [File](#mpi-v1-File) - [FileContents](#mpi-v1-FileContents) @@ -19,12 +21,14 @@ - [GetFileResponse](#mpi-v1-GetFileResponse) - [GetOverviewRequest](#mpi-v1-GetOverviewRequest) - [GetOverviewResponse](#mpi-v1-GetOverviewResponse) + - [SubjectAlternativeNames](#mpi-v1-SubjectAlternativeNames) - [UpdateFileRequest](#mpi-v1-UpdateFileRequest) - [UpdateFileResponse](#mpi-v1-UpdateFileResponse) - [UpdateOverviewRequest](#mpi-v1-UpdateOverviewRequest) - [UpdateOverviewResponse](#mpi-v1-UpdateOverviewResponse) - [File.FileAction](#mpi-v1-File-FileAction) + - [SignatureAlgorithm](#mpi-v1-SignatureAlgorithm) - [FileService](#mpi-v1-FileService) @@ -145,6 +149,44 @@ Command status enum + + +### CertificateDates +Represents the dates for which a certificate is valid + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| not_before | [int64](#int64) | | The start date that for when the certificate is valid | +| not_after | [int64](#int64) | | The end date that for when the certificate is valid | + + + + + + + + +### CertificateMeta +Define the certificate message based on https://pkg.go.dev/crypto/x509#Certificate +and https://github.com/googleapis/googleapis/blob/005df4681b89bd204a90b76168a6dc9d9e7bf4fe/google/cloud/iot/v1/resources.proto#L341 + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| serial_number | [bytes](#bytes) | | Serial number of the certificate, usually a unique identifier, RFC5280 states the upper limit for serial number is 20 octets | +| issuer | [string](#string) | | Issuer details (who issued the certificate) | +| subject | [string](#string) | | Subject details (to whom the certificate is issued) | +| sans | [SubjectAlternativeNames](#mpi-v1-SubjectAlternativeNames) | | Subject Alternative Names (SAN) including DNS names and IP addresses | +| dates | [CertificateDates](#mpi-v1-CertificateDates) | | Timestamps representing the start of certificate validity (Not Before, Not After) | +| signature_algorithm | [SignatureAlgorithm](#mpi-v1-SignatureAlgorithm) | | The algorithm used to sign the certificate (e.g., SHA256-RSA) | +| public_key_algorithm | [string](#string) | | The type of public key in the certificate. | + + + + + + ### ConfigVersion @@ -205,6 +247,7 @@ Meta information about the file, the name (including path) and hash | modified_time | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | Last modified time of the file (created time if never modified) | | permissions | [string](#string) | | The permission set associated with a particular file | | size | [int64](#int64) | | The size of the file in bytes | +| certificate_meta | [CertificateMeta](#mpi-v1-CertificateMeta) | | | @@ -289,6 +332,22 @@ Represents the response payload to a GetOverviewRequest, requesting a list of lo + + +### SubjectAlternativeNames +Represents the Subject Alternative Names for a certificate + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| dns_names | [string](#string) | repeated | List of DNS names in the Subject Alternative Name (SAN) extension | +| ip_addresses | [string](#string) | repeated | List of ip addresses in the SAN extension | + + + + + + ### UpdateFileRequest @@ -363,6 +422,33 @@ Action enumeration | FILE_ACTION_DELETE | 4 | File deleted | + + + +### SignatureAlgorithm +Enum to represent the possible signature algorithms used for certificates + +| Name | Number | Description | +| ---- | ------ | ----------- | +| SIGNATURE_ALGORITHM_UNKNOWN | 0 | Default, unknown or unsupported algorithm | +| MD2_WITH_RSA | 1 | MD2 with RSA (Unsupported) | +| MD5_WITH_RSA | 2 | MD5 with RSA (Only supported for signing, not verification) | +| SHA1_WITH_RSA | 3 | SHA-1 with RSA (Only supported for signing and for verification of CRLs, CSRs, and OCSP responses) | +| SHA256_WITH_RSA | 4 | SHA-256 with RSA | +| SHA384_WITH_RSA | 5 | SHA-384 with RSA | +| SHA512_WITH_RSA | 6 | SHA-512 with RSA | +| DSA_WITH_SHA1 | 7 | DSA with SHA-1 (Unsupported) | +| DSA_WITH_SHA256 | 8 | DSA with SHA-256 (Unsupported) | +| ECDSA_WITH_SHA1 | 9 | ECDSA with SHA-1 (Only supported for signing and for verification of CRLs, CSRs, and OCSP responses) | +| ECDSA_WITH_SHA256 | 10 | ECDSA with SHA-256 | +| ECDSA_WITH_SHA384 | 11 | ECDSA with SHA-384 | +| ECDSA_WITH_SHA512 | 12 | ECDSA with SHA-512 | +| SHA256_WITH_RSA_PSS | 13 | SHA-256 with RSA-PSS | +| SHA384_WITH_RSA_PSS | 14 | SHA-384 with RSA-PSS | +| SHA512_WITH_RSA_PSS | 15 | SHA-512 with RSA-PSS | +| PURE_ED25519 | 16 | Pure Ed25519 | + + diff --git a/go.mod b/go.mod index 72ecff38fa..53c97d51bb 100644 --- a/go.mod +++ b/go.mod @@ -69,6 +69,7 @@ require ( 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/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 @@ -270,7 +271,6 @@ require ( go.opentelemetry.io/collector/extension/auth v0.108.1 // indirect go.opentelemetry.io/collector/extension/zpagesextension v0.108.1 // indirect go.opentelemetry.io/collector/featuregate v1.14.1 // indirect - go.opentelemetry.io/collector/filter v0.108.1 // indirect go.opentelemetry.io/collector/internal/globalgates v0.108.1 // indirect go.opentelemetry.io/collector/pdata/pprofile v0.108.1 // indirect go.opentelemetry.io/collector/pdata/testdata v0.108.1 // indirect diff --git a/internal/collector/nginxossreceiver/documentation.md b/internal/collector/nginxossreceiver/documentation.md index 9ea1efe73a..2a2aa19fe4 100644 --- a/internal/collector/nginxossreceiver/documentation.md +++ b/internal/collector/nginxossreceiver/documentation.md @@ -61,3 +61,10 @@ The number of responses, grouped by status code range. | Name | Description | Values | | ---- | ----------- | ------ | | nginx.status_range | A status code range or bucket for a HTTP response's status code. | Str: ``1xx``, ``2xx``, ``3xx``, ``4xx``, ``5xx`` | + +## Resource Attributes + +| Name | Description | Values | Enabled | +| ---- | ----------- | ------ | ------- | +| instance.id | The nginx instance id. | Any Str | true | +| instance.type | The nginx instance type (nginx, nginxplus). | Any Str | true | diff --git a/internal/collector/nginxossreceiver/internal/config/config.go b/internal/collector/nginxossreceiver/internal/config/config.go index adb267de6f..5d8db53dae 100644 --- a/internal/collector/nginxossreceiver/internal/config/config.go +++ b/internal/collector/nginxossreceiver/internal/config/config.go @@ -22,9 +22,9 @@ const ( type Config struct { confighttp.ClientConfig `mapstructure:",squash"` - AccessLogs []AccessLog `mapstructure:"access_logs"` - scraperhelper.ControllerConfig `mapstructure:",squash"` + AccessLogs []AccessLog `mapstructure:"access_logs"` MetricsBuilderConfig metadata.MetricsBuilderConfig `mapstructure:",squash"` + scraperhelper.ControllerConfig `mapstructure:",squash"` } type AccessLog struct { diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_config.go b/internal/collector/nginxossreceiver/internal/metadata/generated_config.go index 26347611f7..69ac3809b3 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_config.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_config.go @@ -4,6 +4,7 @@ package metadata import ( "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/filter" ) // MetricConfig provides common config for a particular metric. @@ -50,13 +51,58 @@ func DefaultMetricsConfig() MetricsConfig { } } +// ResourceAttributeConfig provides common config for a particular resource attribute. +type ResourceAttributeConfig struct { + Enabled bool `mapstructure:"enabled"` + // Experimental: MetricsInclude defines a list of filters for attribute values. + // If the list is not empty, only metrics with matching resource attribute values will be emitted. + MetricsInclude []filter.Config `mapstructure:"metrics_include"` + // Experimental: MetricsExclude defines a list of filters for attribute values. + // If the list is not empty, metrics with matching resource attribute values will not be emitted. + // MetricsInclude has higher priority than MetricsExclude. + MetricsExclude []filter.Config `mapstructure:"metrics_exclude"` + + enabledSetByUser bool +} + +func (rac *ResourceAttributeConfig) Unmarshal(parser *confmap.Conf) error { + if parser == nil { + return nil + } + err := parser.Unmarshal(rac) + if err != nil { + return err + } + rac.enabledSetByUser = parser.IsSet("enabled") + return nil +} + +// ResourceAttributesConfig provides config for nginx resource attributes. +type ResourceAttributesConfig struct { + InstanceID ResourceAttributeConfig `mapstructure:"instance.id"` + InstanceType ResourceAttributeConfig `mapstructure:"instance.type"` +} + +func DefaultResourceAttributesConfig() ResourceAttributesConfig { + return ResourceAttributesConfig{ + InstanceID: ResourceAttributeConfig{ + Enabled: true, + }, + InstanceType: ResourceAttributeConfig{ + Enabled: true, + }, + } +} + // MetricsBuilderConfig is a configuration for nginx metrics builder. type MetricsBuilderConfig struct { - Metrics MetricsConfig `mapstructure:"metrics"` + Metrics MetricsConfig `mapstructure:"metrics"` + ResourceAttributes ResourceAttributesConfig `mapstructure:"resource_attributes"` } func DefaultMetricsBuilderConfig() MetricsBuilderConfig { return MetricsBuilderConfig{ - Metrics: DefaultMetricsConfig(), + Metrics: DefaultMetricsConfig(), + ResourceAttributes: DefaultResourceAttributesConfig(), } } diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go b/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go index 85d198d88e..2a603a104f 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_config_test.go @@ -30,6 +30,10 @@ func TestMetricsBuilderConfig(t *testing.T) { NginxHTTPRequests: MetricConfig{Enabled: true}, NginxHTTPResponseStatus: MetricConfig{Enabled: true}, }, + ResourceAttributes: ResourceAttributesConfig{ + InstanceID: ResourceAttributeConfig{Enabled: true}, + InstanceType: ResourceAttributeConfig{Enabled: true}, + }, }, }, { @@ -41,13 +45,17 @@ func TestMetricsBuilderConfig(t *testing.T) { NginxHTTPRequests: MetricConfig{Enabled: false}, NginxHTTPResponseStatus: MetricConfig{Enabled: false}, }, + ResourceAttributes: ResourceAttributesConfig{ + InstanceID: ResourceAttributeConfig{Enabled: false}, + InstanceType: ResourceAttributeConfig{Enabled: false}, + }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cfg := loadMetricsBuilderConfig(t, tt.name) - if diff := cmp.Diff(tt.want, cfg, cmpopts.IgnoreUnexported(MetricConfig{})); diff != "" { + if diff := cmp.Diff(tt.want, cfg, cmpopts.IgnoreUnexported(MetricConfig{}, ResourceAttributeConfig{})); diff != "" { t.Errorf("Config mismatch (-expected +actual):\n%s", diff) } }) @@ -63,3 +71,49 @@ func loadMetricsBuilderConfig(t *testing.T, name string) MetricsBuilderConfig { require.NoError(t, sub.Unmarshal(&cfg)) return cfg } + +func TestResourceAttributesConfig(t *testing.T) { + tests := []struct { + name string + want ResourceAttributesConfig + }{ + { + name: "default", + want: DefaultResourceAttributesConfig(), + }, + { + name: "all_set", + want: ResourceAttributesConfig{ + InstanceID: ResourceAttributeConfig{Enabled: true}, + InstanceType: ResourceAttributeConfig{Enabled: true}, + }, + }, + { + name: "none_set", + want: ResourceAttributesConfig{ + InstanceID: ResourceAttributeConfig{Enabled: false}, + InstanceType: ResourceAttributeConfig{Enabled: false}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cfg := loadResourceAttributesConfig(t, tt.name) + if diff := cmp.Diff(tt.want, cfg, cmpopts.IgnoreUnexported(ResourceAttributeConfig{})); diff != "" { + t.Errorf("Config mismatch (-expected +actual):\n%s", diff) + } + }) + } +} + +func loadResourceAttributesConfig(t *testing.T, name string) ResourceAttributesConfig { + cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) + require.NoError(t, err) + sub, err := cm.Sub(name) + require.NoError(t, err) + sub, err = sub.Sub("resource_attributes") + require.NoError(t, err) + cfg := DefaultResourceAttributesConfig() + require.NoError(t, sub.Unmarshal(&cfg)) + return cfg +} diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go index e74642bc94..dfe01f264b 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics.go @@ -6,6 +6,7 @@ import ( "time" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/filter" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/receiver" @@ -302,15 +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. - 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 + metricNginxHTTPConn metricNginxHTTPConn + metricNginxHTTPConnCount metricNginxHTTPConnCount + metricNginxHTTPRequests metricNginxHTTPRequests + metricNginxHTTPResponseStatus metricNginxHTTPResponseStatus } // metricBuilderOption applies changes to default metrics builder. @@ -325,14 +328,28 @@ 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), + 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), + } + if mbc.ResourceAttributes.InstanceID.MetricsInclude != nil { + mb.resourceAttributeIncludeFilter["instance.id"] = filter.CreateFilter(mbc.ResourceAttributes.InstanceID.MetricsInclude) + } + if mbc.ResourceAttributes.InstanceID.MetricsExclude != nil { + mb.resourceAttributeExcludeFilter["instance.id"] = filter.CreateFilter(mbc.ResourceAttributes.InstanceID.MetricsExclude) + } + if mbc.ResourceAttributes.InstanceType.MetricsInclude != nil { + mb.resourceAttributeIncludeFilter["instance.type"] = filter.CreateFilter(mbc.ResourceAttributes.InstanceType.MetricsInclude) + } + if mbc.ResourceAttributes.InstanceType.MetricsExclude != nil { + mb.resourceAttributeExcludeFilter["instance.type"] = filter.CreateFilter(mbc.ResourceAttributes.InstanceType.MetricsExclude) } for _, op := range options { @@ -341,6 +358,11 @@ func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, opt return mb } +// NewResourceBuilder returns a new resource builder that should be used to build a resource associated with for the emitted metrics. +func (mb *MetricsBuilder) NewResourceBuilder() *ResourceBuilder { + return NewResourceBuilder(mb.config.ResourceAttributes) +} + // updateCapacity updates max length of metrics and resource attributes that will be used for the slice capacity. func (mb *MetricsBuilder) updateCapacity(rm pmetric.ResourceMetrics) { if mb.metricsCapacity < rm.ScopeMetrics().At(0).Metrics().Len() { @@ -398,6 +420,16 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { for _, op := range rmo { op(rm) } + for attr, filter := range mb.resourceAttributeIncludeFilter { + if val, ok := rm.Resource().Attributes().Get(attr); ok && !filter.Matches(val.AsString()) { + return + } + } + for attr, filter := range mb.resourceAttributeExcludeFilter { + if val, ok := rm.Resource().Attributes().Get(attr); ok && filter.Matches(val.AsString()) { + return + } + } if ils.Metrics().Len() > 0 { mb.updateCapacity(rm) diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go index 261655b70a..ee4f069719 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_metrics_test.go @@ -42,6 +42,15 @@ func TestMetricsBuilder(t *testing.T) { resAttrsSet: testDataSetNone, expectEmpty: true, }, + { + name: "filter_set_include", + resAttrsSet: testDataSetAll, + }, + { + name: "filter_set_exclude", + resAttrsSet: testDataSetAll, + expectEmpty: true, + }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { @@ -75,7 +84,10 @@ func TestMetricsBuilder(t *testing.T) { allMetricsCount++ mb.RecordNginxHTTPResponseStatusDataPoint(ts, 1, AttributeNginxStatusRange1xx) - res := pcommon.NewResource() + rb := mb.NewResourceBuilder() + rb.SetInstanceID("instance.id-val") + rb.SetInstanceType("instance.type-val") + res := rb.Emit() metrics := mb.Emit(WithResource(res)) if test.expectEmpty { diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_resource.go b/internal/collector/nginxossreceiver/internal/metadata/generated_resource.go new file mode 100644 index 0000000000..d5c655c954 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_resource.go @@ -0,0 +1,43 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/pdata/pcommon" +) + +// ResourceBuilder is a helper struct to build resources predefined in metadata.yaml. +// The ResourceBuilder is not thread-safe and must not to be used in multiple goroutines. +type ResourceBuilder struct { + config ResourceAttributesConfig + res pcommon.Resource +} + +// NewResourceBuilder creates a new ResourceBuilder. This method should be called on the start of the application. +func NewResourceBuilder(rac ResourceAttributesConfig) *ResourceBuilder { + return &ResourceBuilder{ + config: rac, + res: pcommon.NewResource(), + } +} + +// SetInstanceID sets provided value as "instance.id" attribute. +func (rb *ResourceBuilder) SetInstanceID(val string) { + if rb.config.InstanceID.Enabled { + rb.res.Attributes().PutStr("instance.id", val) + } +} + +// SetInstanceType sets provided value as "instance.type" attribute. +func (rb *ResourceBuilder) SetInstanceType(val string) { + if rb.config.InstanceType.Enabled { + rb.res.Attributes().PutStr("instance.type", val) + } +} + +// Emit returns the built resource and resets the internal builder state. +func (rb *ResourceBuilder) Emit() pcommon.Resource { + r := rb.res + rb.res = pcommon.NewResource() + return r +} diff --git a/internal/collector/nginxossreceiver/internal/metadata/generated_resource_test.go b/internal/collector/nginxossreceiver/internal/metadata/generated_resource_test.go new file mode 100644 index 0000000000..f861ef1011 --- /dev/null +++ b/internal/collector/nginxossreceiver/internal/metadata/generated_resource_test.go @@ -0,0 +1,46 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestResourceBuilder(t *testing.T) { + for _, tt := range []string{"default", "all_set", "none_set"} { + t.Run(tt, func(t *testing.T) { + cfg := loadResourceAttributesConfig(t, tt) + rb := NewResourceBuilder(cfg) + rb.SetInstanceID("instance.id-val") + rb.SetInstanceType("instance.type-val") + + res := rb.Emit() + assert.Equal(t, 0, rb.Emit().Attributes().Len()) // Second call should return empty Resource + + switch tt { + case "default": + assert.Equal(t, 2, res.Attributes().Len()) + case "all_set": + assert.Equal(t, 2, res.Attributes().Len()) + case "none_set": + assert.Equal(t, 0, res.Attributes().Len()) + return + default: + assert.Failf(t, "unexpected test case: %s", tt) + } + + val, ok := res.Attributes().Get("instance.id") + assert.True(t, ok) + if ok { + assert.EqualValues(t, "instance.id-val", val.Str()) + } + val, ok = res.Attributes().Get("instance.type") + assert.True(t, ok) + if ok { + assert.EqualValues(t, "instance.type-val", val.Str()) + } + }) + } +} diff --git a/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml b/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml index 6f3036383a..8829a931e8 100644 --- a/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml +++ b/internal/collector/nginxossreceiver/internal/metadata/testdata/config.yaml @@ -9,6 +9,11 @@ all_set: enabled: true nginx.http.response.status: enabled: true + resource_attributes: + instance.id: + enabled: true + instance.type: + enabled: true none_set: metrics: nginx.http.conn: @@ -19,3 +24,28 @@ none_set: enabled: false nginx.http.response.status: enabled: false + resource_attributes: + instance.id: + enabled: false + instance.type: + enabled: false +filter_set_include: + resource_attributes: + instance.id: + enabled: true + metrics_include: + - regexp: ".*" + instance.type: + enabled: true + metrics_include: + - regexp: ".*" +filter_set_exclude: + resource_attributes: + instance.id: + enabled: true + metrics_exclude: + - strict: "instance.id-val" + instance.type: + enabled: true + metrics_exclude: + - strict: "instance.type-val" 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 1868fa0e68..342e2b6eaf 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper.go +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper.go @@ -42,6 +42,7 @@ type ( cfg *config.Config logger *zap.Logger mb *metadata.MetricsBuilder + rb *metadata.ResourceBuilder pipe *pipeline.DirectedPipeline wg *sync.WaitGroup cancel context.CancelFunc @@ -70,7 +71,12 @@ func NewScraper( ) (*NginxLogScraper, error) { logger := settings.Logger logger.Info("Creating NGINX access log scraper") + mb := metadata.NewMetricsBuilder(cfg.MetricsBuilderConfig, settings) + rb := mb.NewResourceBuilder() + rb.SetInstanceID(settings.ID.Name()) + rb.SetInstanceType("nginx") + logger.Debug("NGINX OSS resource info", zap.Any("resource", rb)) operators := make([]operator.Config, 0) @@ -93,6 +99,7 @@ func NewScraper( cfg: cfg, logger: logger, mb: mb, + rb: rb, mut: sync.Mutex{}, outChan: outChan, pipe: stanzaPipeline, @@ -184,7 +191,7 @@ func (nls *NginxLogScraper) Scrape(_ context.Context) (pmetric.Metrics, error) { metadata.AttributeNginxStatusRange5xx, ) - return nls.mb.Emit(), nil + return nls.mb.Emit(metadata.WithResource(nls.rb.Emit())), nil } func (nls *NginxLogScraper) Shutdown(_ context.Context) error { diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper_test.go b/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper_test.go index 986faf55d7..44ff91c648 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper_test.go +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/nginx_log_scraper_test.go @@ -77,7 +77,8 @@ func TestAccessLogScraper(t *testing.T) { pmetrictest.IgnoreStartTimestamp(), pmetrictest.IgnoreMetricDataPointsOrder(), pmetrictest.IgnoreTimestamp(), - pmetrictest.IgnoreMetricsOrder())) + pmetrictest.IgnoreMetricsOrder(), + pmetrictest.IgnoreResourceAttributeValue("instance.id"))) } func TestAccessLogScraperError(t *testing.T) { diff --git a/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/expected.yaml b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/expected.yaml index edc97f287a..6b639b8e54 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/expected.yaml +++ b/internal/collector/nginxossreceiver/internal/scraper/accesslog/testdata/expected.yaml @@ -1,5 +1,9 @@ resourceMetrics: - - resource: {} + - resource: + attributes: + - key: instance.type + value: + stringValue: nginx scopeMetrics: - metrics: - description: The number of responses, grouped by status code range. 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 30a3f82f87..08e93ddc2c 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper.go +++ b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/stub_status_scraper.go @@ -29,6 +29,7 @@ type NginxStubStatusScraper struct { settings component.TelemetrySettings cfg *config.Config mb *metadata.MetricsBuilder + rb *metadata.ResourceBuilder } var _ scraperhelper.Scraper = (*NginxStubStatusScraper)(nil) @@ -37,11 +38,20 @@ func NewScraper( settings receiver.Settings, cfg *config.Config, ) *NginxStubStatusScraper { + logger := settings.Logger + logger.Info("Creating NGINX stub status scraper") + mb := metadata.NewMetricsBuilder(cfg.MetricsBuilderConfig, settings) + rb := mb.NewResourceBuilder() + rb.SetInstanceID(settings.ID.Name()) + rb.SetInstanceType("nginx") + logger.Debug("NGINX OSS resource info", zap.Any("resource", rb)) + return &NginxStubStatusScraper{ settings: settings.TelemetrySettings, cfg: cfg, mb: mb, + rb: rb, } } @@ -111,5 +121,5 @@ func (s *NginxStubStatusScraper) Scrape(context.Context) (pmetric.Metrics, error metadata.AttributeNginxConnOutcomeWAITING, ) - return s.mb.Emit(), nil + 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 8ef8dfd74f..6c34c86092 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 @@ -52,7 +52,8 @@ func TestStubStatusScraper(t *testing.T) { pmetrictest.IgnoreStartTimestamp(), pmetrictest.IgnoreMetricDataPointsOrder(), pmetrictest.IgnoreTimestamp(), - pmetrictest.IgnoreMetricsOrder())) + pmetrictest.IgnoreMetricsOrder(), + pmetrictest.IgnoreResourceAttributeValue("instance.id"))) } func TestStubStatusScraperError(t *testing.T) { diff --git a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml index fc4ff5bc25..5d1cd6d165 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml +++ b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected.yaml @@ -1,5 +1,9 @@ resourceMetrics: - - resource: {} + - resource: + attributes: + - key: instance.type + value: + stringValue: nginx scopeMetrics: - metrics: - description: The total number of connections. diff --git a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected_with_connections_as_gauge.yaml b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected_with_connections_as_gauge.yaml index 458e7e7df4..3f17e3ac98 100644 --- a/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected_with_connections_as_gauge.yaml +++ b/internal/collector/nginxossreceiver/internal/scraper/stubstatus/testdata/expected_with_connections_as_gauge.yaml @@ -1,5 +1,9 @@ resourceMetrics: - - resource: {} + - resource: + attributes: + - key: instance.type + value: + stringValue: nginx scopeMetrics: - metrics: - description: The total number of accepted client connections diff --git a/internal/collector/nginxossreceiver/metadata.yaml b/internal/collector/nginxossreceiver/metadata.yaml index 04dc43a616..ff49eab4cd 100644 --- a/internal/collector/nginxossreceiver/metadata.yaml +++ b/internal/collector/nginxossreceiver/metadata.yaml @@ -7,7 +7,17 @@ status: beta: [metrics] distributions: [contrib] codeowners: - active: [olli-holmala, oliveromahony, apgralG, dhurley, craigell] + active: [olli-holmala, oliveromahony, apgralG, dhurley, craigell, sean-breen] + +resource_attributes: + instance.id: + description: The nginx instance id. + type: string + enabled: true + instance.type: + description: The nginx instance type (nginx, nginxplus). + type: string + enabled: true attributes: nginx.conn.outcome: diff --git a/internal/collector/nginxossreceiver/testdata/integration/expected.yaml b/internal/collector/nginxossreceiver/testdata/integration/expected.yaml index 9c5bc3463b..40813436db 100644 --- a/internal/collector/nginxossreceiver/testdata/integration/expected.yaml +++ b/internal/collector/nginxossreceiver/testdata/integration/expected.yaml @@ -1,5 +1,6 @@ resourceMetrics: - - resource: {} + - resource: + instance.type: nginx scopeMetrics: - metrics: - description: The total number of accepted client connections diff --git a/internal/collector/nginxplusreceiver/config.go b/internal/collector/nginxplusreceiver/config.go index c19be570e0..2297f5534e 100644 --- a/internal/collector/nginxplusreceiver/config.go +++ b/internal/collector/nginxplusreceiver/config.go @@ -18,8 +18,8 @@ const defaultCollectInterval = 10 * time.Second type Config struct { confighttp.ClientConfig `mapstructure:",squash"` - scraperhelper.ControllerConfig `mapstructure:",squash"` MetricsBuilderConfig metadata.MetricsBuilderConfig `mapstructure:",squash"` + scraperhelper.ControllerConfig `mapstructure:",squash"` } // Validate checks if the receiver configuration is valid diff --git a/internal/collector/nginxplusreceiver/documentation.md b/internal/collector/nginxplusreceiver/documentation.md index 6c52660272..7dce5a8621 100644 --- a/internal/collector/nginxplusreceiver/documentation.md +++ b/internal/collector/nginxplusreceiver/documentation.md @@ -906,3 +906,10 @@ The current number of peers removed from the group but still processing active c | ---- | ----------- | ------ | | nginx.zone.name | The name of the shared memory zone. | Any Str | | nginx.upstream.name | The name of the upstream block. | Any Str | + +## Resource Attributes + +| Name | Description | Values | Enabled | +| ---- | ----------- | ------ | ------- | +| instance.id | The nginx instance id. | Any Str | true | +| instance.type | The nginx instance type (nginx, nginxplus) | Any Str | true | diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_config.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_config.go index eb83eb63c0..2059f6cd64 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_config.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_config.go @@ -4,6 +4,7 @@ package metadata import ( "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/filter" ) // MetricConfig provides common config for a particular metric. @@ -266,13 +267,58 @@ func DefaultMetricsConfig() MetricsConfig { } } +// ResourceAttributeConfig provides common config for a particular resource attribute. +type ResourceAttributeConfig struct { + Enabled bool `mapstructure:"enabled"` + // Experimental: MetricsInclude defines a list of filters for attribute values. + // If the list is not empty, only metrics with matching resource attribute values will be emitted. + MetricsInclude []filter.Config `mapstructure:"metrics_include"` + // Experimental: MetricsExclude defines a list of filters for attribute values. + // If the list is not empty, metrics with matching resource attribute values will not be emitted. + // MetricsInclude has higher priority than MetricsExclude. + MetricsExclude []filter.Config `mapstructure:"metrics_exclude"` + + enabledSetByUser bool +} + +func (rac *ResourceAttributeConfig) Unmarshal(parser *confmap.Conf) error { + if parser == nil { + return nil + } + err := parser.Unmarshal(rac) + if err != nil { + return err + } + rac.enabledSetByUser = parser.IsSet("enabled") + return nil +} + +// ResourceAttributesConfig provides config for nginxplus resource attributes. +type ResourceAttributesConfig struct { + InstanceID ResourceAttributeConfig `mapstructure:"instance.id"` + InstanceType ResourceAttributeConfig `mapstructure:"instance.type"` +} + +func DefaultResourceAttributesConfig() ResourceAttributesConfig { + return ResourceAttributesConfig{ + InstanceID: ResourceAttributeConfig{ + Enabled: true, + }, + InstanceType: ResourceAttributeConfig{ + Enabled: true, + }, + } +} + // MetricsBuilderConfig is a configuration for nginxplus metrics builder. type MetricsBuilderConfig struct { - Metrics MetricsConfig `mapstructure:"metrics"` + Metrics MetricsConfig `mapstructure:"metrics"` + ResourceAttributes ResourceAttributesConfig `mapstructure:"resource_attributes"` } func DefaultMetricsBuilderConfig() MetricsBuilderConfig { return MetricsBuilderConfig{ - Metrics: DefaultMetricsConfig(), + Metrics: DefaultMetricsConfig(), + ResourceAttributes: DefaultResourceAttributesConfig(), } } diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_config_test.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_config_test.go index a5b204deeb..4f4503192c 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_config_test.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_config_test.go @@ -84,6 +84,10 @@ func TestMetricsBuilderConfig(t *testing.T) { NginxStreamUpstreamPeerUnavailable: MetricConfig{Enabled: true}, NginxStreamUpstreamZombieCount: MetricConfig{Enabled: true}, }, + ResourceAttributes: ResourceAttributesConfig{ + InstanceID: ResourceAttributeConfig{Enabled: true}, + InstanceType: ResourceAttributeConfig{Enabled: true}, + }, }, }, { @@ -149,13 +153,17 @@ func TestMetricsBuilderConfig(t *testing.T) { NginxStreamUpstreamPeerUnavailable: MetricConfig{Enabled: false}, NginxStreamUpstreamZombieCount: MetricConfig{Enabled: false}, }, + ResourceAttributes: ResourceAttributesConfig{ + InstanceID: ResourceAttributeConfig{Enabled: false}, + InstanceType: ResourceAttributeConfig{Enabled: false}, + }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cfg := loadMetricsBuilderConfig(t, tt.name) - if diff := cmp.Diff(tt.want, cfg, cmpopts.IgnoreUnexported(MetricConfig{})); diff != "" { + if diff := cmp.Diff(tt.want, cfg, cmpopts.IgnoreUnexported(MetricConfig{}, ResourceAttributeConfig{})); diff != "" { t.Errorf("Config mismatch (-expected +actual):\n%s", diff) } }) @@ -171,3 +179,49 @@ func loadMetricsBuilderConfig(t *testing.T, name string) MetricsBuilderConfig { require.NoError(t, sub.Unmarshal(&cfg)) return cfg } + +func TestResourceAttributesConfig(t *testing.T) { + tests := []struct { + name string + want ResourceAttributesConfig + }{ + { + name: "default", + want: DefaultResourceAttributesConfig(), + }, + { + name: "all_set", + want: ResourceAttributesConfig{ + InstanceID: ResourceAttributeConfig{Enabled: true}, + InstanceType: ResourceAttributeConfig{Enabled: true}, + }, + }, + { + name: "none_set", + want: ResourceAttributesConfig{ + InstanceID: ResourceAttributeConfig{Enabled: false}, + InstanceType: ResourceAttributeConfig{Enabled: false}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cfg := loadResourceAttributesConfig(t, tt.name) + if diff := cmp.Diff(tt.want, cfg, cmpopts.IgnoreUnexported(ResourceAttributeConfig{})); diff != "" { + t.Errorf("Config mismatch (-expected +actual):\n%s", diff) + } + }) + } +} + +func loadResourceAttributesConfig(t *testing.T, name string) ResourceAttributesConfig { + cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) + require.NoError(t, err) + sub, err := cm.Sub(name) + require.NoError(t, err) + sub, err = sub.Sub("resource_attributes") + require.NoError(t, err) + cfg := DefaultResourceAttributesConfig() + require.NoError(t, sub.Unmarshal(&cfg)) + return cfg +} diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go index 866fb5a735..21768959cd 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go @@ -6,6 +6,7 @@ import ( "time" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/filter" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/receiver" @@ -3560,6 +3561,8 @@ type MetricsBuilder struct { 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 @@ -3694,6 +3697,20 @@ func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, opt 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) + } + if mbc.ResourceAttributes.InstanceID.MetricsExclude != nil { + mb.resourceAttributeExcludeFilter["instance.id"] = filter.CreateFilter(mbc.ResourceAttributes.InstanceID.MetricsExclude) + } + if mbc.ResourceAttributes.InstanceType.MetricsInclude != nil { + mb.resourceAttributeIncludeFilter["instance.type"] = filter.CreateFilter(mbc.ResourceAttributes.InstanceType.MetricsInclude) + } + if mbc.ResourceAttributes.InstanceType.MetricsExclude != nil { + mb.resourceAttributeExcludeFilter["instance.type"] = filter.CreateFilter(mbc.ResourceAttributes.InstanceType.MetricsExclude) } for _, op := range options { @@ -3702,6 +3719,11 @@ func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, opt return mb } +// NewResourceBuilder returns a new resource builder that should be used to build a resource associated with for the emitted metrics. +func (mb *MetricsBuilder) NewResourceBuilder() *ResourceBuilder { + return NewResourceBuilder(mb.config.ResourceAttributes) +} + // updateCapacity updates max length of metrics and resource attributes that will be used for the slice capacity. func (mb *MetricsBuilder) updateCapacity(rm pmetric.ResourceMetrics) { if mb.metricsCapacity < rm.ScopeMetrics().At(0).Metrics().Len() { @@ -3813,6 +3835,16 @@ func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { for _, op := range rmo { op(rm) } + for attr, filter := range mb.resourceAttributeIncludeFilter { + if val, ok := rm.Resource().Attributes().Get(attr); ok && !filter.Matches(val.AsString()) { + return + } + } + for attr, filter := range mb.resourceAttributeExcludeFilter { + if val, ok := rm.Resource().Attributes().Get(attr); ok && filter.Matches(val.AsString()) { + return + } + } if ils.Metrics().Len() > 0 { mb.updateCapacity(rm) diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go index 8e8f64cbb9..f12924e8e0 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go @@ -42,6 +42,15 @@ func TestMetricsBuilder(t *testing.T) { resAttrsSet: testDataSetNone, expectEmpty: true, }, + { + name: "filter_set_include", + resAttrsSet: testDataSetAll, + }, + { + name: "filter_set_exclude", + resAttrsSet: testDataSetAll, + expectEmpty: true, + }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { @@ -291,7 +300,10 @@ func TestMetricsBuilder(t *testing.T) { allMetricsCount++ mb.RecordNginxStreamUpstreamZombieCountDataPoint(ts, 1, "nginx.zone.name-val", "nginx.upstream.name-val") - res := pcommon.NewResource() + rb := mb.NewResourceBuilder() + rb.SetInstanceID("instance.id-val") + rb.SetInstanceType("instance.type-val") + res := rb.Emit() metrics := mb.Emit(WithResource(res)) if test.expectEmpty { diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_resource.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_resource.go new file mode 100644 index 0000000000..d5c655c954 --- /dev/null +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_resource.go @@ -0,0 +1,43 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/pdata/pcommon" +) + +// ResourceBuilder is a helper struct to build resources predefined in metadata.yaml. +// The ResourceBuilder is not thread-safe and must not to be used in multiple goroutines. +type ResourceBuilder struct { + config ResourceAttributesConfig + res pcommon.Resource +} + +// NewResourceBuilder creates a new ResourceBuilder. This method should be called on the start of the application. +func NewResourceBuilder(rac ResourceAttributesConfig) *ResourceBuilder { + return &ResourceBuilder{ + config: rac, + res: pcommon.NewResource(), + } +} + +// SetInstanceID sets provided value as "instance.id" attribute. +func (rb *ResourceBuilder) SetInstanceID(val string) { + if rb.config.InstanceID.Enabled { + rb.res.Attributes().PutStr("instance.id", val) + } +} + +// SetInstanceType sets provided value as "instance.type" attribute. +func (rb *ResourceBuilder) SetInstanceType(val string) { + if rb.config.InstanceType.Enabled { + rb.res.Attributes().PutStr("instance.type", val) + } +} + +// Emit returns the built resource and resets the internal builder state. +func (rb *ResourceBuilder) Emit() pcommon.Resource { + r := rb.res + rb.res = pcommon.NewResource() + return r +} diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_resource_test.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_resource_test.go new file mode 100644 index 0000000000..f861ef1011 --- /dev/null +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_resource_test.go @@ -0,0 +1,46 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestResourceBuilder(t *testing.T) { + for _, tt := range []string{"default", "all_set", "none_set"} { + t.Run(tt, func(t *testing.T) { + cfg := loadResourceAttributesConfig(t, tt) + rb := NewResourceBuilder(cfg) + rb.SetInstanceID("instance.id-val") + rb.SetInstanceType("instance.type-val") + + res := rb.Emit() + assert.Equal(t, 0, rb.Emit().Attributes().Len()) // Second call should return empty Resource + + switch tt { + case "default": + assert.Equal(t, 2, res.Attributes().Len()) + case "all_set": + assert.Equal(t, 2, res.Attributes().Len()) + case "none_set": + assert.Equal(t, 0, res.Attributes().Len()) + return + default: + assert.Failf(t, "unexpected test case: %s", tt) + } + + val, ok := res.Attributes().Get("instance.id") + assert.True(t, ok) + if ok { + assert.EqualValues(t, "instance.id-val", val.Str()) + } + val, ok = res.Attributes().Get("instance.type") + assert.True(t, ok) + if ok { + assert.EqualValues(t, "instance.type-val", val.Str()) + } + }) + } +} diff --git a/internal/collector/nginxplusreceiver/internal/metadata/testdata/config.yaml b/internal/collector/nginxplusreceiver/internal/metadata/testdata/config.yaml index 94ed619f0d..148884fdbc 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/testdata/config.yaml +++ b/internal/collector/nginxplusreceiver/internal/metadata/testdata/config.yaml @@ -117,6 +117,11 @@ all_set: enabled: true nginx.stream.upstream.zombie.count: enabled: true + resource_attributes: + instance.id: + enabled: true + instance.type: + enabled: true none_set: metrics: nginx.cache.bytes: @@ -235,3 +240,28 @@ none_set: enabled: false nginx.stream.upstream.zombie.count: enabled: false + resource_attributes: + instance.id: + enabled: false + instance.type: + enabled: false +filter_set_include: + resource_attributes: + instance.id: + enabled: true + metrics_include: + - regexp: ".*" + instance.type: + enabled: true + metrics_include: + - regexp: ".*" +filter_set_exclude: + resource_attributes: + instance.id: + enabled: true + metrics_exclude: + - strict: "instance.id-val" + instance.type: + enabled: true + metrics_exclude: + - strict: "instance.type-val" diff --git a/internal/collector/nginxplusreceiver/metadata.yaml b/internal/collector/nginxplusreceiver/metadata.yaml index 642cf2f92d..13d27868f3 100644 --- a/internal/collector/nginxplusreceiver/metadata.yaml +++ b/internal/collector/nginxplusreceiver/metadata.yaml @@ -7,7 +7,17 @@ status: beta: [metrics] distributions: [contrib] codeowners: - active: [olli-holmala, oliveromahony, apgralG, dhurley, craigell] + active: [olli-holmala, oliveromahony, apgralG, dhurley, craigell, sean-breen] + +resource_attributes: + instance.id: + description: The nginx instance id. + type: string + enabled: true + instance.type: + description: The nginx instance type (nginx, nginxplus) + type: string + enabled: true attributes: nginx.cache.outcome: diff --git a/internal/collector/nginxplusreceiver/scraper.go b/internal/collector/nginxplusreceiver/scraper.go index c4d6d8fe3d..dd09ba6011 100644 --- a/internal/collector/nginxplusreceiver/scraper.go +++ b/internal/collector/nginxplusreceiver/scraper.go @@ -36,6 +36,7 @@ type nginxPlusScraper struct { settings component.TelemetrySettings cfg *Config mb *metadata.MetricsBuilder + rb *metadata.ResourceBuilder logger *zap.Logger } @@ -43,8 +44,10 @@ func newNginxPlusScraper( settings receiver.Settings, cfg *Config, ) (*nginxPlusScraper, error) { - mb := metadata.NewMetricsBuilder(cfg.MetricsBuilderConfig, settings) + logger := settings.Logger + logger.Info("Creating NGINX Plus scraper") + mb := metadata.NewMetricsBuilder(cfg.MetricsBuilderConfig, settings) plusClient, err := plusapi.NewNginxClient(cfg.Endpoint, plusapi.WithMaxAPIVersion(), ) @@ -52,11 +55,17 @@ func newNginxPlusScraper( return nil, err } + rb := mb.NewResourceBuilder() + rb.SetInstanceID(settings.ID.Name()) + rb.SetInstanceType("nginxplus") + logger.Debug("NGINX Plus resource info", zap.Any("resource", rb)) + return &nginxPlusScraper{ plusClient: plusClient, settings: settings.TelemetrySettings, cfg: cfg, mb: mb, + rb: rb, logger: settings.Logger, }, nil } @@ -68,10 +77,9 @@ func (nps *nginxPlusScraper) scrape(ctx context.Context) (pmetric.Metrics, error } nps.logger.Debug("NGINX Plus stats", zap.Any("stats", stats)) - nps.recordMetrics(stats) - return nps.mb.Emit(), nil + return nps.mb.Emit(metadata.WithResource(nps.rb.Emit())), nil } func (nps *nginxPlusScraper) recordMetrics(stats *plusapi.Stats) { diff --git a/internal/collector/nginxplusreceiver/scraper_test.go b/internal/collector/nginxplusreceiver/scraper_test.go index 046b7798a5..a10d1117af 100644 --- a/internal/collector/nginxplusreceiver/scraper_test.go +++ b/internal/collector/nginxplusreceiver/scraper_test.go @@ -44,6 +44,6 @@ func TestScraper(t *testing.T) { pmetrictest.IgnoreMetricDataPointsOrder(), pmetrictest.IgnoreTimestamp(), pmetrictest.IgnoreMetricsOrder(), - ), + pmetrictest.IgnoreResourceAttributeValue("instance.id")), ) } diff --git a/internal/collector/nginxplusreceiver/testdata/expected.yaml b/internal/collector/nginxplusreceiver/testdata/expected.yaml index e8458f3910..acb9089ae1 100644 --- a/internal/collector/nginxplusreceiver/testdata/expected.yaml +++ b/internal/collector/nginxplusreceiver/testdata/expected.yaml @@ -1,5 +1,9 @@ resourceMetrics: - - resource: {} + - resource: + attributes: + - key: instance.type + value: + stringValue: nginxplus scopeMetrics: - metrics: - description: The total number of NGINX config reloads. diff --git a/internal/collector/otel_collector_plugin.go b/internal/collector/otel_collector_plugin.go index 160ec3e113..0f4e3e7e9e 100644 --- a/internal/collector/otel_collector_plugin.go +++ b/internal/collector/otel_collector_plugin.go @@ -11,8 +11,10 @@ import ( "log/slog" "os" "strings" + "sync" "time" + "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/config" @@ -31,6 +33,7 @@ type ( service *otelcol.Collector cancel context.CancelFunc config *config.Config + mu *sync.Mutex stopped bool } ) @@ -63,6 +66,8 @@ func New(conf *config.Config) (*Collector, error) { return &Collector{ config: conf, service: oTelCollector, + stopped: true, + mu: &sync.Mutex{}, }, nil } @@ -73,6 +78,13 @@ func (oc *Collector) Init(ctx context.Context, mp bus.MessagePipeInterface) erro var runCtx context.Context runCtx, oc.cancel = context.WithCancel(ctx) + if !oc.config.AreReceiversConfigured() { + slog.InfoContext(runCtx, "No receivers configured for OTel Collector. "+ + "Waiting to discover a receiver before starting OTel collector.") + + return nil + } + err := writeCollectorConfig(oc.config.Collector) if err != nil { return fmt.Errorf("write OTel Collector config: %w", err) @@ -192,6 +204,8 @@ func (oc *Collector) Process(ctx context.Context, msg *bus.Message) { switch msg.Topic { case bus.NginxConfigUpdateTopic: oc.handleNginxConfigUpdate(ctx, msg) + case bus.ResourceUpdateTopic: + oc.handleResourceUpdate(ctx, msg) default: slog.DebugContext(ctx, "OTel collector plugin unknown topic", "topic", msg.Topic) } @@ -200,6 +214,7 @@ func (oc *Collector) Process(ctx context.Context, msg *bus.Message) { // Subscriptions returns the list of topics the plugin is subscribed to func (oc *Collector) Subscriptions() []string { return []string{ + bus.ResourceUpdateTopic, bus.NginxConfigUpdateTopic, } } @@ -225,7 +240,48 @@ func (oc *Collector) handleNginxConfigUpdate(ctx context.Context, msg *bus.Messa } } +func (oc *Collector) handleResourceUpdate(ctx context.Context, msg *bus.Message) { + var reloadCollector bool + resourceUpdateContext, ok := msg.Data.(*v1.Resource) + if !ok { + slog.ErrorContext(ctx, "Unable to cast message payload to *v1.Resource", "payload", msg.Data) + return + } + + if oc.config.Collector.Processors.Resource == nil { + oc.config.Collector.Processors.Resource = &config.Resource{ + Attributes: make([]config.ResourceAttribute, 0), + } + } + + if oc.config.Collector.Processors.Resource != nil && + resourceUpdateContext.GetResourceId() != "" { + reloadCollector = oc.updateResourceAttributes( + []config.ResourceAttribute{ + { + Key: "resource.id", + Action: "insert", + Value: resourceUpdateContext.GetResourceId(), + }, + }, + ) + } + + if reloadCollector { + slog.InfoContext(ctx, "Reloading OTel collector config") + err := writeCollectorConfig(oc.config.Collector) + if err != nil { + slog.ErrorContext(ctx, "Failed to write OTel Collector config", "error", err) + return + } + + oc.restartCollector(ctx) + } +} + func (oc *Collector) restartCollector(ctx context.Context) { + oc.mu.Lock() + defer oc.mu.Unlock() err := oc.Close(ctx) if err != nil { slog.ErrorContext(ctx, "Failed to shutdown OTel Collector", "error", err) @@ -345,6 +401,31 @@ func (oc *Collector) updateExistingNginxOSSReceiver( return nginxReceiverFound, reloadCollector } +// nolint: revive +func (oc *Collector) updateResourceAttributes( + attributesToAdd []config.ResourceAttribute, +) (reloadCollector bool) { + reloadCollector = false + + if oc.config.Collector.Processors.Resource.Attributes != nil { + OUTER: + for _, toAdd := range attributesToAdd { + for _, action := range oc.config.Collector.Processors.Resource.Attributes { + if action.Key == toAdd.Key { + continue OUTER + } + } + oc.config.Collector.Processors.Resource.Attributes = append( + oc.config.Collector.Processors.Resource.Attributes, + toAdd, + ) + reloadCollector = true + } + } + + return reloadCollector +} + func isOSSReceiverChanged(nginxReceiver config.NginxReceiver, nginxConfigContext *model.NginxConfigContext) bool { return nginxReceiver.StubStatus != nginxConfigContext.StubStatus || 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 c852b6a82e..f79f4252a9 100644 --- a/internal/collector/otel_collector_plugin_test.go +++ b/internal/collector/otel_collector_plugin_test.go @@ -5,11 +5,16 @@ package collector import ( + "bytes" "context" "fmt" + "strings" "testing" "time" + "github.com/nginx/agent/v3/test/protos" + "github.com/nginx/agent/v3/test/stub" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/otelcol" @@ -29,6 +34,27 @@ func TestCollector_New(t *testing.T) { require.NoError(t, err, "NewCollector should not return an error with valid config") } +func TestCollector_Init(t *testing.T) { + conf := types.OTelConfig(t) + conf.Collector = &config.Collector{} + + logBuf := &bytes.Buffer{} + stub.StubLoggerWith(logBuf) + + collector, err := New(conf) + require.NoError(t, err, "NewCollector should not return an error with valid config") + + 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) + } + + assert.True(t, collector.stopped) +} + func TestCollector_InitAndClose(t *testing.T) { conf := types.OTelConfig(t) conf.Collector.Log.Path = "" @@ -61,7 +87,7 @@ func TestCollector_InitAndClose(t *testing.T) { } // nolint: revive -func TestCollector_Process(t *testing.T) { +func TestCollector_ProcessNginxConfigUpdateTopic(t *testing.T) { nginxPlusMock := helpers.NewMockNGINXPlusAPIServer(t) defer nginxPlusMock.Close() @@ -83,7 +109,7 @@ func TestCollector_Process(t *testing.T) { }, }, receivers: config.Receivers{ - HostMetrics: config.HostMetrics{ + HostMetrics: &config.HostMetrics{ CollectionInterval: time.Minute, InitialDelay: time.Second, Scrapers: &config.HostMetricsScrapers{ @@ -119,7 +145,7 @@ func TestCollector_Process(t *testing.T) { }, }, receivers: config.Receivers{ - HostMetrics: config.HostMetrics{ + HostMetrics: &config.HostMetrics{ CollectionInterval: time.Minute, InitialDelay: time.Second, Scrapers: &config.HostMetricsScrapers{ @@ -200,6 +226,133 @@ func TestCollector_Process(t *testing.T) { } } +func TestCollector_ProcessResourceUpdateTopic(t *testing.T) { + conf := types.OTelConfig(t) + conf.Collector.Log.Path = "" + conf.Collector.Processors.Batch = nil + conf.Collector.Processors.Attribute = nil + conf.Collector.Processors.Resource = nil + + tests := []struct { + message *bus.Message + processors config.Processors + name string + }{ + { + name: "Test 1: Resource update adds resource id attribute", + message: &bus.Message{ + Topic: bus.ResourceUpdateTopic, + Data: protos.GetHostResource(), + }, + processors: config.Processors{ + Resource: &config.Resource{ + Attributes: []config.ResourceAttribute{ + { + Key: "resource.id", + Action: "insert", + Value: "1234", + }, + }, + }, + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(tt *testing.T) { + collector, err := New(conf) + require.NoError(tt, err, "NewCollector should not return an error with valid config") + + 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 }, + 6*time.Second, + 100*time.Millisecond, + ) + + collector.Process(ctx, test.message) + + assert.Eventually( + tt, + func() bool { return collector.service.GetState() == otelcol.StateRunning }, + 6*time.Second, + 100*time.Millisecond, + ) + + assert.Equal(tt, test.processors, collector.config.Collector.Processors) + }) + } +} + +func TestCollector_ProcessResourceUpdateTopicFails(t *testing.T) { + conf := types.OTelConfig(t) + conf.Collector.Log.Path = "" + conf.Collector.Processors.Batch = nil + conf.Collector.Processors.Attribute = nil + conf.Collector.Processors.Resource = nil + + tests := []struct { + message *bus.Message + processors config.Processors + name string + }{ + { + name: "Test 1: Message cannot be parsed to v1.Resource", + message: &bus.Message{ + Topic: bus.ResourceUpdateTopic, + Data: struct{}{}, + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(tt *testing.T) { + collector, err := New(conf) + require.NoError(tt, err, "NewCollector should not return an error with valid config") + + 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 }, + 6*time.Second, + 100*time.Millisecond, + ) + + collector.Process(ctx, test.message) + + assert.Eventually( + tt, + func() bool { return collector.service.GetState() == otelcol.StateRunning }, + 6*time.Second, + 100*time.Millisecond, + ) + + assert.Equal(tt, + config.Processors{ + Batch: nil, + Attribute: nil, + Resource: nil, + }, + collector.config.Collector.Processors) + }) + } +} + // nolint: dupl func TestCollector_updateExistingNginxOSSReceiver(t *testing.T) { conf := types.OTelConfig(t) @@ -355,3 +508,59 @@ func TestCollector_updateExistingNginxPlusReceiver(t *testing.T) { }) } } + +func TestCollector_updateResourceAttributes(t *testing.T) { + conf := types.OTelConfig(t) + conf.Collector.Log.Path = "" + conf.Collector.Processors.Batch = nil + conf.Collector.Processors.Attribute = nil + conf.Collector.Processors.Resource = nil + + tests := []struct { + name string + setup []config.ResourceAttribute + attributes []config.ResourceAttribute + expectedAttribs []config.ResourceAttribute + expectedReloadRequired bool + }{ + { + name: "Test 1: No Actions returns false", + setup: []config.ResourceAttribute{}, + attributes: []config.ResourceAttribute{}, + expectedReloadRequired: false, + expectedAttribs: []config.ResourceAttribute{}, + }, + { + name: "Test 2: Adding an action returns true", + setup: []config.ResourceAttribute{}, + attributes: []config.ResourceAttribute{{Key: "test", Action: "insert", Value: "test value"}}, + expectedReloadRequired: true, + expectedAttribs: []config.ResourceAttribute{{Key: "test", Action: "insert", Value: "test value"}}, + }, + { + name: "Test 3: Adding a duplicate key doesn't append", + setup: []config.ResourceAttribute{{Key: "test", Action: "insert", Value: "test value 1"}}, + attributes: []config.ResourceAttribute{ + {Key: "test", Action: "insert", Value: "updated value 2"}, + }, + expectedReloadRequired: false, + expectedAttribs: []config.ResourceAttribute{{Key: "test", Action: "insert", Value: "test value 1"}}, + }, + } + + for _, test := range tests { + t.Run(test.name, func(tt *testing.T) { + collector, err := New(conf) + require.NoError(tt, err, "NewCollector should not return an error with valid config") + + // set up Actions + conf.Collector.Processors.Resource = &config.Resource{Attributes: test.setup} + + reloadRequired := collector.updateResourceAttributes(test.attributes) + assert.Equal(tt, + test.expectedAttribs, + conf.Collector.Processors.Resource.Attributes) + assert.Equal(tt, test.expectedReloadRequired, reloadRequired) + }) + } +} diff --git a/internal/collector/otelcol.tmpl b/internal/collector/otelcol.tmpl index 44b454ab8e..e6b3baca83 100644 --- a/internal/collector/otelcol.tmpl +++ b/internal/collector/otelcol.tmpl @@ -1,5 +1,5 @@ receivers: -{{- if ne .Receivers.HostMetrics.CollectionInterval 0 }} +{{- if ne .Receivers.HostMetrics nil }} hostmetrics: collection_interval: {{ .Receivers.HostMetrics.CollectionInterval }} initial_delay: {{ .Receivers.HostMetrics.InitialDelay }} @@ -76,6 +76,28 @@ receivers: {{- end }} processors: +{{- if ne .Processors.Resource nil }} +{{- if .Processors.Resource.Attributes }} + resource: + attributes: +{{- range .Processors.Resource.Attributes }} + - key: {{ .Key }} + action: {{ .Action }} + value: {{ .Value }} +{{- end }} +{{- end }} +{{- end }} +{{- if ne .Processors.Attribute nil }} +{{- if .Processors.Attribute.Actions }} + attributes: + actions: +{{- range .Processors.Attribute.Actions }} + - key: {{ .Key }} + action: {{ .Action }} + value: {{ .Value }} +{{- end }} +{{- end }} +{{- end }} {{- if ne .Processors.Batch nil }} batch: send_batch_size: {{ .Processors.Batch.SendBatchSize }} @@ -101,10 +123,16 @@ exporters: {{ if gt (len .TLS.Cert) 0 -}}cert_file: "{{- .TLS.Cert -}}"{{- end }} {{ if gt (len .TLS.Key) 0 -}}key_file: "{{- .TLS.Key -}}"{{- end }} {{- end }} + {{- if .Authenticator }} + auth: + authenticator: {{ .Authenticator -}} + {{- end }} {{- end }} {{- if ne .Exporters.PrometheusExporter nil }} prometheus: endpoint: "{{ .Exporters.PrometheusExporter.Server.Host -}}:{{- .Exporters.PrometheusExporter.Server.Port }}" + resource_to_telemetry_conversion: + enabled: true {{- end }} {{- if ne .Exporters.Debug nil }} debug: @@ -128,6 +156,24 @@ extensions: key_file: "{{ .Extensions.Health.Server.TLS.Key -}}" {{- end }} {{- end }} + + {{- if ne .Extensions.HeadersSetter nil }} + headers_setter: + headers: + {{- range $index, $header := .Extensions.HeadersSetter.Headers }} + - action: "{{ .Action -}}" + key: "{{ .Key -}}" + {{- if .Value }} + value: "{{ .Value -}}" + {{- end }} + {{- if .DefaultValue }} + default_value: "{{ .DefaultValue -}}" + {{- end }} + {{- if .FromContext }} + from_context: "{{ .FromContext -}}" + {{- end }} + {{- end }} + {{- end }} {{- end }} service: @@ -144,11 +190,14 @@ service: {{- if ne .Extensions.Health nil }} - health_check {{- end}} + {{- if ne .Extensions.HeadersSetter nil }} + - headers_setter + {{- end}} {{- end}} pipelines: metrics: receivers: - {{- if ne .Receivers.HostMetrics.CollectionInterval 0 }} + {{- if ne .Receivers.HostMetrics nil }} - hostmetrics {{- end }} {{- range $index, $otlpReceiver := .Receivers.OtlpReceivers }} @@ -161,6 +210,16 @@ service: - nginxplus/{{- .InstanceID -}} {{- end }} processors: + {{- if ne .Processors.Resource nil }} + {{- if .Processors.Resource.Attributes }} + - resource + {{- end }} + {{- end }} + {{- if ne .Processors.Attribute nil }} + {{- if .Processors.Attribute.Actions }} + - attributes + {{- end }} + {{- end }} {{- if ne .Processors.Batch nil }} - batch {{- end }} diff --git a/internal/collector/settings_test.go b/internal/collector/settings_test.go index fb65198941..a512a5bc26 100644 --- a/internal/collector/settings_test.go +++ b/internal/collector/settings_test.go @@ -64,7 +64,7 @@ func TestTemplateWrite(t *testing.T) { cfg.Collector.Exporters.Debug = &config.DebugExporter{} - cfg.Collector.Receivers.HostMetrics = config.HostMetrics{ + cfg.Collector.Receivers.HostMetrics = &config.HostMetrics{ CollectionInterval: time.Minute, InitialDelay: time.Second, Scrapers: &config.HostMetricsScrapers{ @@ -100,6 +100,22 @@ func TestTemplateWrite(t *testing.T) { }, }) + cfg.Collector.Extensions.HeadersSetter = &config.HeadersSetter{ + Headers: []config.Header{ + { + Action: "insert", + Key: "authorization", + Value: "key1", + }, { + Action: "upsert", + Key: "uuid", + Value: "1234", + }, + }, + } + + cfg.Collector.Exporters.OtlpExporters[0].Authenticator = "headers_setter" + require.NotNil(t, cfg) err := writeCollectorConfig(cfg.Collector) diff --git a/internal/config/config.go b/internal/config/config.go index c3836af80a..05f5887861 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -127,15 +127,15 @@ func registerFlags() { fs.String( LogLevelKey, "info", - `The desired verbosity level for logging messages from nginx-agent. - Available options, in order of severity from highest to lowest, are: - panic, fatal, error, info and debug.`, + "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 and debug.", ) fs.String( LogPathKey, "", - `The path to output log messages to. - If the default path doesn't exist, log messages are output to stdout/stderr.`, + "The path to output log messages to. "+ + "If the default path doesn't exist, log messages are output to stdout/stderr.", ) fs.Duration( @@ -257,7 +257,7 @@ func registerCommandFlags(fs *flag.FlagSet) { fs.Bool( CommandTLSSkipVerifyKey, DefCommandTLSSkipVerifyKey, - "Testing only. SkipVerify controls client verification of a server's certificate chain and host name.", + "Testing only. Skip verify controls client verification of a server's certificate chain and host name.", ) fs.String( CommandTLSServerNameKey, @@ -276,16 +276,16 @@ func registerCollectorFlags(fs *flag.FlagSet) { fs.String( CollectorLogLevelKey, DefCollectorLogLevel, - `The desired verbosity level for logging messages from nginx-agent OTel collector. - Available options, in order of severity from highest to lowest, are: - ERROR, WARN, INFO and DEBUG.`, + "The desired verbosity level for logging messages from nginx-agent OTel collector. "+ + "Available options, in order of severity from highest to lowest, are: "+ + "ERROR, WARN, INFO and DEBUG.", ) fs.String( CollectorLogPathKey, DefCollectorLogPath, - `The path to output OTel collector log messages to. - If the default path doesn't exist, log messages are output to stdout/stderr.`, + "The path to output OTel collector log messages to. "+ + "If the default path doesn't exist, log messages are output to stdout/stderr.", ) fs.Uint32( @@ -305,6 +305,51 @@ func registerCollectorFlags(fs *flag.FlagSet) { DefCollectorBatchProcessorTimeout, `Time duration after which a batch will be sent regardless of size.`, ) + + fs.String( + CollectorExtensionsHealthServerHostKey, + DefCollectorExtensionsHealthServerHost, + `The hostname of the address to publish the OTel collector health check status.`, + ) + + fs.Int32( + CollectorExtensionsHealthServerPortKey, + DefCollectorExtensionsHealthServerPort, + `The port of the address to publish the OTel collector health check status.`, + ) + + fs.String( + CollectorExtensionsHealthPathKey, + DefCollectorExtensionsHealthPath, + `The path to be configured for the OTel collector health check server`, + ) + + fs.String( + CollectorExtensionsHealthTLSCertKey, + DefCollectorExtensionsHealthTLSCertPath, + "The path to the certificate file to use for TLS communication with the OTel collector health check server.", + ) + fs.String( + CollectorExtensionsHealthTLSKeyKey, + DefCollectorExtensionsHealthTLSKeyPath, + "The path to the certificate key file to use for TLS communication "+ + "with the OTel collector health check server.", + ) + fs.String( + CollectorExtensionsHealthTLSCaKey, + DefCollectorExtensionsHealthTLSCAPath, + "The path to CA certificate file to use for TLS communication with the OTel collector health check server.", + ) + fs.Bool( + CollectorExtensionsHealthTLSSkipVerifyKey, + DefCollectorExtensionsHealthTLSSkipVerify, + "Testing only. Skip verify controls client verification of a server's certificate chain and host name.", + ) + fs.String( + CollectorExtensionsHealthTLSServerNameKey, + DefCollectorExtensionsHealthTLServerNameKey, + "Specifies the name of the server sent in the TLS configuration.", + ) } func seekFileInPaths(fileName string, directories ...string) (string, error) { @@ -383,38 +428,16 @@ func resolveClient() *Client { } func resolveCollector(allowedDirs []string) (*Collector, error) { - // We do not want to return a sentinel error because we are joining all returned errors - // from config resolution and returning them without pattern matching. - // nolint: nilnil - if !viperInstance.IsSet(CollectorRootKey) { - return nil, nil - } + var receivers Receivers - var ( - err error - exporters Exporters - receivers Receivers - extensions Extensions - log Log - ) - - err = errors.Join( - err, - resolveMapStructure(CollectorExportersKey, &exporters), - resolveMapStructure(CollectorReceiversKey, &receivers), - resolveMapStructure(CollectorExtensionsKey, &extensions), - resolveMapStructure(CollectorLogKey, &log), - ) + err := resolveMapStructure(CollectorReceiversKey, &receivers) if err != nil { - return nil, fmt.Errorf("unmarshal collector config: %w", err) - } - - if log.Level == "" { - log.Level = DefCollectorLogLevel + return nil, fmt.Errorf("unmarshal collector receivers config: %w", err) } - if log.Path == "" { - log.Path = DefCollectorLogPath + exporters, err := resolveExporters() + if err != nil { + return nil, fmt.Errorf("unmarshal collector exporters config: %w", err) } col := &Collector{ @@ -422,8 +445,8 @@ func resolveCollector(allowedDirs []string) (*Collector, error) { Exporters: exporters, Processors: resolveProcessors(), Receivers: receivers, - Extensions: extensions, - Log: &log, + Extensions: resolveExtensions(), + Log: resolveCollectorLog(), } // Check for self-signed certificate true in Agent conf @@ -439,14 +462,63 @@ func resolveCollector(allowedDirs []string) (*Collector, error) { return col, nil } +func resolveExporters() (Exporters, error) { + var otlpExporters []OtlpExporter + exporters := Exporters{} + + if viperInstance.IsSet(CollectorDebugExporterKey) { + exporters.Debug = &DebugExporter{} + } + + if isPrometheusExporterSet() { + exporters.PrometheusExporter = &PrometheusExporter{ + Server: &ServerConfig{ + Host: viperInstance.GetString(CollectorPrometheusExporterServerHostKey), + Port: viperInstance.GetInt(CollectorPrometheusExporterServerPortKey), + }, + } + + if arePrometheusExportTLSSettingsSet() { + exporters.PrometheusExporter.TLS = &TLSConfig{ + Cert: viperInstance.GetString(CollectorPrometheusExporterTLSCertKey), + Key: viperInstance.GetString(CollectorPrometheusExporterTLSKeyKey), + Ca: viperInstance.GetString(CollectorPrometheusExporterTLSCaKey), + SkipVerify: viperInstance.GetBool(CollectorPrometheusExporterTLSSkipVerifyKey), + ServerName: viperInstance.GetString(CollectorPrometheusExporterTLSServerNameKey), + } + } + } + + err := resolveMapStructure(CollectorOtlpExportersKey, &otlpExporters) + if err != nil { + return exporters, err + } + + exporters.OtlpExporters = otlpExporters + + return exporters, nil +} + +func isPrometheusExporterSet() bool { + return viperInstance.IsSet(CollectorPrometheusExporterKey) || + (viperInstance.IsSet(CollectorPrometheusExporterServerHostKey) && + viperInstance.IsSet(CollectorPrometheusExporterServerPortKey)) +} + func resolveProcessors() Processors { - processors := Processors{} + processors := Processors{ + Batch: &Batch{ + SendBatchSize: viperInstance.GetUint32(CollectorBatchProcessorSendBatchSizeKey), + SendBatchMaxSize: viperInstance.GetUint32(CollectorBatchProcessorSendBatchMaxSizeKey), + Timeout: viperInstance.GetDuration(CollectorBatchProcessorTimeoutKey), + }, + } - if viperInstance.IsSet(CollectorBatchProcessorKey) { - processors.Batch = &Batch{} - processors.Batch.SendBatchSize = viperInstance.GetUint32(CollectorBatchProcessorSendBatchSizeKey) - processors.Batch.SendBatchMaxSize = viperInstance.GetUint32(CollectorBatchProcessorSendBatchMaxSizeKey) - processors.Batch.Timeout = viperInstance.GetDuration(CollectorBatchProcessorTimeoutKey) + if viperInstance.IsSet(CollectorAttributeProcessorKey) { + err := resolveMapStructure(CollectorAttributeProcessorKey, &processors.Attribute) + if err != nil { + return processors + } } return processors @@ -503,6 +575,47 @@ func processOtlpReceivers(tlsConfig *OtlpTLSConfig) error { return nil } +func resolveExtensions() Extensions { + if isHealthExtensionSet() { + health := &Health{ + Server: &ServerConfig{ + Host: viperInstance.GetString(CollectorExtensionsHealthServerHostKey), + Port: viperInstance.GetInt(CollectorExtensionsHealthServerPortKey), + }, + Path: viperInstance.GetString(CollectorExtensionsHealthPathKey), + } + + if areHealthExtensionTLSSettingsSet() { + health.TLS = &TLSConfig{ + Cert: viperInstance.GetString(CollectorExtensionsHealthTLSCertKey), + Key: viperInstance.GetString(CollectorExtensionsHealthTLSKeyKey), + Ca: viperInstance.GetString(CollectorExtensionsHealthTLSCaKey), + SkipVerify: viperInstance.GetBool(CollectorExtensionsHealthTLSSkipVerifyKey), + ServerName: viperInstance.GetString(CollectorExtensionsHealthTLSServerNameKey), + } + } + + return Extensions{ + Health: health, + } + } + + return Extensions{} +} + +func isHealthExtensionSet() bool { + return viperInstance.IsSet(CollectorExtensionsHealthKey) || + (viperInstance.IsSet(CollectorExtensionsHealthServerHostKey) && + viperInstance.IsSet(CollectorExtensionsHealthServerPortKey)) +} + +func resolveCollectorLog() *Log { + return &Log{ + Level: viperInstance.GetString(CollectorLogLevelKey), + Path: viperInstance.GetString(CollectorLogPathKey), + } +} + func resolveCommand() *Command { serverType, ok := parseServerType(viperInstance.GetString(CommandServerTypeKey)) if !ok { @@ -548,6 +661,22 @@ func areTLSSettingsSet() bool { viperInstance.IsSet(CommandTLSServerNameKey) } +func areHealthExtensionTLSSettingsSet() bool { + return viperInstance.IsSet(CollectorExtensionsHealthTLSCertKey) || + viperInstance.IsSet(CollectorExtensionsHealthTLSKeyKey) || + viperInstance.IsSet(CollectorExtensionsHealthTLSCaKey) || + viperInstance.IsSet(CollectorExtensionsHealthTLSSkipVerifyKey) || + viperInstance.IsSet(CollectorExtensionsHealthTLSServerNameKey) +} + +func arePrometheusExportTLSSettingsSet() bool { + return viperInstance.IsSet(CollectorPrometheusExporterTLSCertKey) || + viperInstance.IsSet(CollectorPrometheusExporterTLSKeyKey) || + viperInstance.IsSet(CollectorPrometheusExporterTLSCaKey) || + viperInstance.IsSet(CollectorPrometheusExporterTLSSkipVerifyKey) || + viperInstance.IsSet(CollectorPrometheusExporterTLSServerNameKey) +} + func resolveCommon() *CommonSettings { return &CommonSettings{ InitialInterval: DefBackoffInitialInterval, diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 52949d1523..ad58a7a287 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -179,14 +179,18 @@ func TestResolveCollector(t *testing.T) { viperInstance = viper.NewWithOptions(viper.KeyDelimiter(KeyDelimiter)) viperInstance.Set(CollectorConfigPathKey, expected.ConfigPath) + viperInstance.Set(CollectorLogPathKey, expected.Log.Path) + viperInstance.Set(CollectorLogLevelKey, expected.Log.Level) viperInstance.Set(CollectorReceiversKey, expected.Receivers) viperInstance.Set(CollectorBatchProcessorKey, expected.Processors.Batch) viperInstance.Set(CollectorBatchProcessorSendBatchSizeKey, expected.Processors.Batch.SendBatchSize) viperInstance.Set(CollectorBatchProcessorSendBatchMaxSizeKey, expected.Processors.Batch.SendBatchMaxSize) viperInstance.Set(CollectorBatchProcessorTimeoutKey, expected.Processors.Batch.Timeout) viperInstance.Set(CollectorExportersKey, expected.Exporters) - viperInstance.Set(CollectorExtensionsKey, expected.Extensions) - viperInstance.Set(CollectorLogKey, expected.Log) + viperInstance.Set(CollectorOtlpExportersKey, expected.Exporters.OtlpExporters) + viperInstance.Set(CollectorExtensionsHealthServerHostKey, expected.Extensions.Health.Server.Host) + viperInstance.Set(CollectorExtensionsHealthServerPortKey, expected.Extensions.Health.Server.Port) + viperInstance.Set(CollectorExtensionsHealthPathKey, expected.Extensions.Health.Path) actual, err := resolveCollector(testDefault.AllowedDirectories) require.NoError(t, err) @@ -309,9 +313,6 @@ func getAgentConfig() *Config { Host: "127.0.0.1", Port: 1234, }, - Auth: &AuthConfig{ - Token: "super-secret-token", - }, TLS: &TLSConfig{ Cert: "/path/to/server-cert.pem", Key: "/path/to/server-cert.pem", @@ -370,6 +371,7 @@ func getAgentConfig() *Config { Port: 1337, Type: 0, }, + Path: "/", }, }, Log: &Log{ diff --git a/internal/config/defaults.go b/internal/config/defaults.go index ac20722c47..526ea914c9 100644 --- a/internal/config/defaults.go +++ b/internal/config/defaults.go @@ -16,14 +16,6 @@ const ( DefNginxReloadMonitoringPeriod = 10 * time.Second DefTreatErrorsAsWarnings = false - DefCollectorConfigPath = "/etc/nginx-agent/opentelemetry-collector-agent.yaml" - DefCollectorLogLevel = "INFO" - DefCollectorLogPath = "/var/log/nginx-agent/opentelemetry-collector-agent.log" - DefCollectorTLSCertPath = "/var/lib/nginx-agent/cert.pem" - DefCollectorTLSKeyPath = "/var/lib/nginx-agent/key.pem" - DefCollectorTLSCAPath = "/var/lib/nginx-agent/ca.pem" - DefCollectorTLSSANNames = "127.0.0.1,::1,localhost" - DefCommandServerHostKey = "" DefCommandServerPortKey = 0 DefCommandServerTypeKey = "grpc" @@ -34,27 +26,51 @@ const ( DefCommandTLSSkipVerifyKey = false DefCommandTLServerNameKey = "" - DefBackoffInitialInterval = 50 * time.Millisecond - // the value is 0 <= and < 1 - DefBackoffRandomizationFactor = 0.1 + DefMaxMessageSize = 0 // 0 = unset + DefMaxMessageRecieveSize = 4194304 // default 4 MB + DefMaxMessageSendSize = math.MaxInt32 + + // Backoff defaults + DefBackoffInitialInterval = 50 * time.Millisecond + DefBackoffRandomizationFactor = 0.1 // the value is 0 <= and < 1 DefBackoffMultiplier = 1.5 DefBackoffMaxInterval = 200 * time.Millisecond DefBackoffMaxElapsedTime = 3 * time.Second + // Watcher defaults DefInstanceWatcherMonitoringFrequency = 5 * time.Second DefInstanceHealthWatcherMonitoringFrequency = 5 * time.Second DefFileWatcherMonitoringFrequency = 5 * time.Second - // 0 = unset - DefMaxMessageSize = 0 - // default 4 MB - DefMaxMessageRecieveSize = 4194304 - // math.MaxInt32 - DefMaxMessageSendSize = math.MaxInt32 + // Collector defaults + DefCollectorConfigPath = "/etc/nginx-agent/opentelemetry-collector-agent.yaml" + DefCollectorLogLevel = "INFO" + DefCollectorLogPath = "/var/log/nginx-agent/opentelemetry-collector-agent.log" + DefCollectorTLSCertPath = "/var/lib/nginx-agent/cert.pem" + DefCollectorTLSKeyPath = "/var/lib/nginx-agent/key.pem" + DefCollectorTLSCAPath = "/var/lib/nginx-agent/ca.pem" + DefCollectorTLSSANNames = "127.0.0.1,::1,localhost" DefCollectorBatchProcessorSendBatchSize = 8192 DefCollectorBatchProcessorSendBatchMaxSize = 0 DefCollectorBatchProcessorTimeout = 200 * time.Millisecond + + DefCollectorExtensionsHealthServerHost = "localhost" + DefCollectorExtensionsHealthServerPort = 13133 + DefCollectorExtensionsHealthPath = "/" + DefCollectorExtensionsHealthTLSCertPath = "" + DefCollectorExtensionsHealthTLSKeyPath = "" + DefCollectorExtensionsHealthTLSCAPath = "" + DefCollectorExtensionsHealthTLSSkipVerify = false + DefCollectorExtensionsHealthTLServerNameKey = "" + + DefCollectorPrometheusExporterServerHost = "" + DefCollectorPrometheusExporterServerPort = 0 + DefCollectorPrometheusExporterTLSCertPath = "" + DefCollectorPrometheusExporterTLSKeyPath = "" + DefCollectorPrometheusExporterTLSCAPath = "" + DefCollectorPrometheusExporterTLSSkipVerify = false + DefCollectorPrometheusExporterTLServerNameKey = "" ) func DefaultFeatures() []string { diff --git a/internal/config/flags.go b/internal/config/flags.go index ccd4393575..a14ba8fcc1 100644 --- a/internal/config/flags.go +++ b/internal/config/flags.go @@ -26,41 +26,63 @@ const ( var ( // child flags saved as vars to enable easier prefixing. - ClientPermitWithoutStreamKey = pre(ClientRootKey) + "permit_without_stream" - ClientTimeKey = pre(ClientRootKey) + "time" - ClientTimeoutKey = pre(ClientRootKey) + "timeout" - ClientMaxMessageSendSizeKey = pre(ClientRootKey) + "max_message_send_size" - ClientMaxMessageReceiveSizeKey = pre(ClientRootKey) + "max_message_receive_size" - ClientMaxMessageSizeKey = pre(ClientRootKey) + "max_message_size" - CollectorConfigPathKey = pre(CollectorRootKey) + "config_path" - CollectorExportersKey = pre(CollectorRootKey) + "exporters" - CollectorProcessorsKey = pre(CollectorRootKey) + "processors" - CollectorBatchProcessorKey = pre(CollectorProcessorsKey) + "batch" - CollectorBatchProcessorSendBatchSizeKey = pre(CollectorBatchProcessorKey) + "send_batch_size" - CollectorBatchProcessorSendBatchMaxSizeKey = pre(CollectorBatchProcessorKey) + "send_batch_max_size" - CollectorBatchProcessorTimeoutKey = pre(CollectorBatchProcessorKey) + "timeout" - CollectorExtensionsKey = pre(CollectorRootKey) + "extensions" - CollectorReceiversKey = pre(CollectorRootKey) + "receivers" - CollectorLogKey = pre(CollectorRootKey) + "log" - CollectorLogLevelKey = pre(CollectorLogKey) + "level" - CollectorLogPathKey = pre(CollectorLogKey) + "path" - CommandAuthKey = pre(CommandRootKey) + "auth" - CommandAuthTokenKey = pre(CommandAuthKey) + "token" - CommandServerHostKey = pre(CommandServerKey) + "host" - CommandServerKey = pre(CommandRootKey) + "server" - CommandServerPortKey = pre(CommandServerKey) + "port" - CommandServerTypeKey = pre(CommandServerKey) + "type" - CommandTLSCaKey = pre(CommandTLSKey) + "ca" - CommandTLSCertKey = pre(CommandTLSKey) + "cert" - CommandTLSKey = pre(CommandRootKey) + "tls" - CommandTLSKeyKey = pre(CommandTLSKey) + "key" - CommandTLSServerNameKey = pre(CommandRootKey) + "server_name" - CommandTLSSkipVerifyKey = pre(CommandTLSKey) + "skip_verify" - LogLevelKey = pre(LogLevelRootKey) + "level" - LogPathKey = pre(LogLevelRootKey) + "path" - NginxReloadMonitoringPeriodKey = pre(DataPlaneConfigRootKey, "nginx") + "reload_monitoring_period" - NginxTreatWarningsAsErrorsKey = pre(DataPlaneConfigRootKey, "nginx") + "treat_warnings_as_errors" - NginxExcludeLogsKey = pre(DataPlaneConfigRootKey, "nginx") + "exclude_logs" + ClientPermitWithoutStreamKey = pre(ClientRootKey) + "permit_without_stream" + ClientTimeKey = pre(ClientRootKey) + "time" + ClientTimeoutKey = pre(ClientRootKey) + "timeout" + ClientMaxMessageSendSizeKey = pre(ClientRootKey) + "max_message_send_size" + ClientMaxMessageReceiveSizeKey = pre(ClientRootKey) + "max_message_receive_size" + ClientMaxMessageSizeKey = pre(ClientRootKey) + "max_message_size" + CollectorConfigPathKey = pre(CollectorRootKey) + "config_path" + CollectorExportersKey = pre(CollectorRootKey) + "exporters" + CollectorAttributeProcessorKey = pre(CollectorProcessorsKey) + "attribute" + CollectorDebugExporterKey = pre(CollectorExportersKey) + "debug" + CollectorPrometheusExporterKey = pre(CollectorExportersKey) + "prometheus_exporter" + CollectorPrometheusExporterServerHostKey = pre(CollectorPrometheusExporterKey) + "server_host" + CollectorPrometheusExporterServerPortKey = pre(CollectorPrometheusExporterKey) + "server_port" + CollectorPrometheusExporterTLSKey = pre(CollectorPrometheusExporterKey) + "tls" + CollectorPrometheusExporterTLSCertKey = pre(CollectorPrometheusExporterTLSKey) + "cert" + CollectorPrometheusExporterTLSKeyKey = pre(CollectorPrometheusExporterTLSKey) + "key" + CollectorPrometheusExporterTLSCaKey = pre(CollectorPrometheusExporterTLSKey) + "ca" + CollectorPrometheusExporterTLSSkipVerifyKey = pre(CollectorPrometheusExporterTLSKey) + "skip_verify" + CollectorPrometheusExporterTLSServerNameKey = pre(CollectorPrometheusExporterTLSKey) + "server_name" + CollectorOtlpExportersKey = pre(CollectorExportersKey) + "otlp_exporters" + CollectorProcessorsKey = pre(CollectorRootKey) + "processors" + CollectorBatchProcessorKey = pre(CollectorProcessorsKey) + "batch" + CollectorBatchProcessorSendBatchSizeKey = pre(CollectorBatchProcessorKey) + "send_batch_size" + CollectorBatchProcessorSendBatchMaxSizeKey = pre(CollectorBatchProcessorKey) + "send_batch_max_size" + CollectorBatchProcessorTimeoutKey = pre(CollectorBatchProcessorKey) + "timeout" + CollectorExtensionsKey = pre(CollectorRootKey) + "extensions" + CollectorExtensionsHealthKey = pre(CollectorExtensionsKey) + "health" + CollectorExtensionsHealthServerHostKey = pre(CollectorExtensionsHealthKey) + "server_host" + CollectorExtensionsHealthServerPortKey = pre(CollectorExtensionsHealthKey) + "server_port" + CollectorExtensionsHealthPathKey = pre(CollectorExtensionsHealthKey) + "path" + CollectorExtensionsHealthTLSKey = pre(CollectorExtensionsHealthKey) + "tls" + CollectorExtensionsHealthTLSCaKey = pre(CollectorExtensionsHealthTLSKey) + "ca" + CollectorExtensionsHealthTLSCertKey = pre(CollectorExtensionsHealthTLSKey) + "cert" + CollectorExtensionsHealthTLSKeyKey = pre(CollectorExtensionsHealthTLSKey) + "key" + CollectorExtensionsHealthTLSServerNameKey = pre(CollectorExtensionsHealthTLSKey) + "server_name" + CollectorExtensionsHealthTLSSkipVerifyKey = pre(CollectorExtensionsHealthTLSKey) + "skip_verify" + CollectorReceiversKey = pre(CollectorRootKey) + "receivers" + CollectorLogKey = pre(CollectorRootKey) + "log" + CollectorLogLevelKey = pre(CollectorLogKey) + "level" + CollectorLogPathKey = pre(CollectorLogKey) + "path" + CommandAuthKey = pre(CommandRootKey) + "auth" + CommandAuthTokenKey = pre(CommandAuthKey) + "token" + CommandServerHostKey = pre(CommandServerKey) + "host" + CommandServerKey = pre(CommandRootKey) + "server" + CommandServerPortKey = pre(CommandServerKey) + "port" + CommandServerTypeKey = pre(CommandServerKey) + "type" + CommandTLSKey = pre(CommandRootKey) + "tls" + CommandTLSCaKey = pre(CommandTLSKey) + "ca" + CommandTLSCertKey = pre(CommandTLSKey) + "cert" + CommandTLSKeyKey = pre(CommandTLSKey) + "key" + CommandTLSServerNameKey = pre(CommandTLSKey) + "server_name" + CommandTLSSkipVerifyKey = pre(CommandTLSKey) + "skip_verify" + LogLevelKey = pre(LogLevelRootKey) + "level" + LogPathKey = pre(LogLevelRootKey) + "path" + NginxReloadMonitoringPeriodKey = pre(DataPlaneConfigRootKey, "nginx") + "reload_monitoring_period" + NginxTreatWarningsAsErrorsKey = pre(DataPlaneConfigRootKey, "nginx") + "treat_warnings_as_errors" + NginxExcludeLogsKey = pre(DataPlaneConfigRootKey, "nginx") + "exclude_logs" ) func pre(prefixes ...string) string { diff --git a/internal/config/types.go b/internal/config/types.go index 4d328d8da9..0e36ae0819 100644 --- a/internal/config/types.go +++ b/internal/config/types.go @@ -89,13 +89,14 @@ type ( } OtlpExporter struct { - Server *ServerConfig `yaml:"-" mapstructure:"server"` - Auth *AuthConfig `yaml:"-" mapstructure:"auth"` - TLS *TLSConfig `yaml:"-" mapstructure:"tls"` + Server *ServerConfig `yaml:"-" mapstructure:"server"` + TLS *TLSConfig `yaml:"-" mapstructure:"tls"` + Authenticator string `yaml:"-" mapstructure:"authenticator"` } Extensions struct { - Health *Health `yaml:"-" mapstructure:"health"` + Health *Health `yaml:"-" mapstructure:"health"` + HeadersSetter *HeadersSetter `yaml:"-" mapstructure:"headers_setter"` } Health struct { @@ -104,6 +105,18 @@ type ( Path string `yaml:"-" mapstructure:"path"` } + HeadersSetter struct { + Headers []Header `yaml:"-" mapstructure:"headers"` + } + + Header struct { + Action string `yaml:"-" mapstructure:"action"` + Key string `yaml:"-" mapstructure:"key"` + Value string `yaml:"-" mapstructure:"value"` + DefaultValue string `yaml:"-" mapstructure:"default_value"` + FromContext string `yaml:"-" mapstructure:"from_context"` + } + DebugExporter struct{} PrometheusExporter struct { @@ -113,7 +126,29 @@ type ( // OTel Collector Processors configuration. Processors struct { - Batch *Batch `yaml:"-" mapstructure:"batch"` + Attribute *Attribute `yaml:"-" mapstructure:"attribute"` + Resource *Resource `yaml:"-" mapstructure:"resource"` + Batch *Batch `yaml:"-" mapstructure:"batch"` + } + + Attribute struct { + Actions []Action `yaml:"-" mapstructure:"actions"` + } + + Action struct { + Key string `yaml:"key" mapstructure:"key"` + Action string `yaml:"action" mapstructure:"action"` + Value string `yaml:"value" mapstructure:"value"` + } + + Resource struct { + Attributes []ResourceAttribute `yaml:"-" mapstructure:"attributes"` + } + + ResourceAttribute struct { + Key string `yaml:"key" mapstructure:"key"` + Action string `yaml:"action" mapstructure:"action"` + Value string `yaml:"value" mapstructure:"value"` } Batch struct { @@ -124,10 +159,10 @@ type ( // OTel Collector Receiver configuration. Receivers struct { + HostMetrics *HostMetrics `yaml:"-" mapstructure:"host_metrics"` OtlpReceivers []OtlpReceiver `yaml:"-" mapstructure:"otlp_receivers"` NginxReceivers []NginxReceiver `yaml:"-" mapstructure:"nginx_receivers"` NginxPlusReceivers []NginxPlusReceiver `yaml:"-" mapstructure:"nginx_plus_receivers"` - HostMetrics HostMetrics `yaml:"-" mapstructure:"host_metrics"` } OtlpReceiver struct { @@ -294,6 +329,27 @@ func (c *Config) IsFeatureEnabled(feature string) bool { return false } +func (c *Config) IsACollectorExporterConfigured() bool { + if c.Collector == nil { + return false + } + + return c.Collector.Exporters.PrometheusExporter != nil || + c.Collector.Exporters.OtlpExporters != nil || + c.Collector.Exporters.Debug != nil +} + +func (c *Config) AreReceiversConfigured() bool { + if c.Collector == nil { + return false + } + + return c.Collector.Receivers.NginxPlusReceivers != nil || + c.Collector.Receivers.OtlpReceivers != nil || + c.Collector.Receivers.NginxReceivers != nil || + c.Collector.Receivers.HostMetrics != nil +} + func isAllowedDir(dir string, allowedDirs []string) bool { for _, allowedDirectory := range allowedDirs { if strings.HasPrefix(dir, allowedDirectory) { diff --git a/internal/file/file_plugin.go b/internal/file/file_plugin.go index 4e83a0acbf..7aa962677b 100644 --- a/internal/file/file_plugin.go +++ b/internal/file/file_plugin.go @@ -69,7 +69,7 @@ func (fp *FilePlugin) Process(ctx context.Context, msg *bus.Message) { case bus.ConfigApplyRequestTopic: fp.handleConfigApplyRequest(ctx, msg) case bus.ConfigApplySuccessfulTopic, bus.RollbackCompleteTopic: - fp.clearCache() + fp.handleConfigApplyRollbackComplete(ctx, msg) case bus.ConfigApplyFailedTopic: fp.handleConfigApplyFailedRequest(ctx, msg) default: @@ -89,9 +89,16 @@ func (fp *FilePlugin) Subscriptions() []string { } } -func (fp *FilePlugin) clearCache() { - slog.Debug("Clearing cache after config apply") +func (fp *FilePlugin) handleConfigApplyRollbackComplete(ctx context.Context, msg *bus.Message) { + response, ok := msg.Data.(*mpi.DataPlaneResponse) + + if !ok { + slog.ErrorContext(ctx, "Unable to cast message payload to *mpi.DataPlaneResponse", "payload", msg.Data) + return + } + fp.fileManagerService.ClearCache() + fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) } func (fp *FilePlugin) handleConfigApplyFailedRequest(ctx context.Context, msg *bus.Message) { @@ -114,9 +121,9 @@ func (fp *FilePlugin) handleConfigApplyFailedRequest(ctx context.Context, msg *b mpi.CommandResponse_COMMAND_STATUS_FAILURE, "Config apply failed, rollback failed", data.InstanceID, data.Error.Error()) + fp.fileManagerService.ClearCache() fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: rollbackResponse}) fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: applyResponse}) - fp.fileManagerService.ClearCache() return } @@ -160,9 +167,9 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes "", ) + fp.fileManagerService.ClearCache() fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.ConfigApplySuccessfulTopic, Data: instanceID}) - fp.fileManagerService.ClearCache() return case model.Error: @@ -180,8 +187,8 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes err.Error(), ) - fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) fp.fileManagerService.ClearCache() + fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) return case model.RollbackRequired: @@ -212,8 +219,8 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes "Config apply failed, rollback failed", configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), rollbackErr.Error()) - fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: rollbackResponse}) fp.fileManagerService.ClearCache() + fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: rollbackResponse}) return } @@ -224,8 +231,8 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes "Config apply failed, rollback successful", configApplyRequest.GetOverview().GetConfigVersion().GetInstanceId(), err.Error()) - fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) fp.fileManagerService.ClearCache() + fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) return case model.OK: diff --git a/internal/file/file_plugin_test.go b/internal/file/file_plugin_test.go index e1ca4b3d55..f111c3a820 100644 --- a/internal/file/file_plugin_test.go +++ b/internal/file/file_plugin_test.go @@ -12,6 +12,9 @@ import ( "testing" "time" + "github.com/google/uuid" + "google.golang.org/protobuf/types/known/timestamppb" + mpi "github.com/nginx/agent/v3/api/grpc/mpi/v1" "github.com/nginx/agent/v3/api/grpc/mpi/v1/v1fakes" "github.com/nginx/agent/v3/internal/bus" @@ -426,3 +429,44 @@ func TestFilePlugin_Process_ConfigApplyFailedTopic(t *testing.T) { }) } } + +func TestFilePlugin_Process_ConfigApllyRollbackCompleteTopic(t *testing.T) { + ctx := context.Background() + instance := protos.GetNginxOssInstance([]string{}) + mockFileManager := &filefakes.FakeFileManagerServiceInterface{} + + messagePipe := bus.NewFakeMessagePipe() + agentConfig := types.AgentConfig() + fakeGrpcConnection := &grpcfakes.FakeGrpcConnectionInterface{} + filePlugin := NewFilePlugin(agentConfig, fakeGrpcConnection) + + err := filePlugin.Init(ctx, messagePipe) + require.NoError(t, err) + filePlugin.fileManagerService = mockFileManager + + expectedResponse := &mpi.DataPlaneResponse{ + MessageMeta: &mpi.MessageMeta{ + MessageId: uuid.NewString(), + CorrelationId: "dfsbhj6-bc92-30c1-a9c9-85591422068e", + Timestamp: timestamppb.Now(), + }, + CommandResponse: &mpi.CommandResponse{ + Status: mpi.CommandResponse_COMMAND_STATUS_OK, + Message: "Config apply successful", + Error: "", + }, + InstanceId: instance.GetInstanceMeta().GetInstanceId(), + } + + filePlugin.Process(ctx, &bus.Message{Topic: bus.ConfigApplySuccessfulTopic, Data: expectedResponse}) + + messages := messagePipe.GetMessages() + response, ok := messages[0].Data.(*mpi.DataPlaneResponse) + assert.True(t, ok) + + assert.Equal(t, expectedResponse.GetCommandResponse().GetStatus(), response.GetCommandResponse().GetStatus()) + assert.Equal(t, expectedResponse.GetCommandResponse().GetMessage(), response.GetCommandResponse().GetMessage()) + assert.Equal(t, expectedResponse.GetCommandResponse().GetError(), response.GetCommandResponse().GetError()) + assert.Equal(t, expectedResponse.GetMessageMeta().GetCorrelationId(), response.GetMessageMeta().GetCorrelationId()) + assert.Equal(t, expectedResponse.GetInstanceId(), response.GetInstanceId()) +} diff --git a/internal/plugin/plugin_manager.go b/internal/plugin/plugin_manager.go index 5288bf53f9..7744ce7833 100644 --- a/internal/plugin/plugin_manager.go +++ b/internal/plugin/plugin_manager.go @@ -58,13 +58,16 @@ func addCommandAndFilePlugins(ctx context.Context, plugins []bus.Plugin, agentCo } func addCollectorPlugin(ctx context.Context, agentConfig *config.Config, plugins []bus.Plugin) []bus.Plugin { - if agentConfig.Collector != nil { + if agentConfig.IsACollectorExporterConfigured() { oTelCollector, err := collector.New(agentConfig) if err == nil { plugins = append(plugins, oTelCollector) } else { - slog.ErrorContext(ctx, "init collector plugin", "error", err) + slog.ErrorContext(ctx, "Failed to initialize collector plugin", "error", err) } + } else { + slog.InfoContext(ctx, "Agent OTel collector isn't started. "+ + "Configure a collector to begin collecting metrics.") } return plugins diff --git a/internal/plugin/plugin_manager_test.go b/internal/plugin/plugin_manager_test.go index 779d38efd7..89b86668b5 100644 --- a/internal/plugin/plugin_manager_test.go +++ b/internal/plugin/plugin_manager_test.go @@ -56,7 +56,11 @@ func TestLoadPlugins(t *testing.T) { }, { name: "Test 3: Load metrics collector plugin", input: &config.Config{ - Collector: &config.Collector{}, + Collector: &config.Collector{ + Exporters: config.Exporters{ + Debug: &config.DebugExporter{}, + }, + }, }, expected: []bus.Plugin{ &resource.Resource{}, diff --git a/internal/resource/resource_plugin.go b/internal/resource/resource_plugin.go index a5779aa2f3..f916761f93 100644 --- a/internal/resource/resource_plugin.go +++ b/internal/resource/resource_plugin.go @@ -137,17 +137,15 @@ func (r *Resource) handleWriteConfigSuccessful(ctx context.Context, msg *bus.Mes return } + response := r.createDataPlaneResponse(data.CorrelationID, mpi.CommandResponse_COMMAND_STATUS_OK, "Config apply successful", data.InstanceID, "") - instance := r.resourceService.Instance(data.InstanceID) - - r.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: response}) r.messagePipe.Process( ctx, &bus.Message{ Topic: bus.ConfigApplySuccessfulTopic, - Data: instance.GetInstanceMeta().GetInstanceId(), + Data: response, }, ) } @@ -170,9 +168,8 @@ func (r *Resource) handleRollbackWrite(ctx context.Context, msg *bus.Message) { mpi.CommandResponse_COMMAND_STATUS_FAILURE, "Config apply failed, rollback failed", data.InstanceID, data.Error.Error()) - r.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: applyResponse}) r.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: rollbackResponse}) - r.messagePipe.Process(ctx, &bus.Message{Topic: bus.RollbackCompleteTopic, Data: data.InstanceID}) + r.messagePipe.Process(ctx, &bus.Message{Topic: bus.RollbackCompleteTopic, Data: applyResponse}) return } @@ -181,8 +178,7 @@ func (r *Resource) handleRollbackWrite(ctx context.Context, msg *bus.Message) { mpi.CommandResponse_COMMAND_STATUS_FAILURE, "Config apply failed, rollback successful", data.InstanceID, data.Error.Error()) - r.messagePipe.Process(ctx, &bus.Message{Topic: bus.DataPlaneResponseTopic, Data: applyResponse}) - r.messagePipe.Process(ctx, &bus.Message{Topic: bus.RollbackCompleteTopic, Data: data.InstanceID}) + r.messagePipe.Process(ctx, &bus.Message{Topic: bus.RollbackCompleteTopic, Data: applyResponse}) } func (*Resource) createDataPlaneResponse(correlationID string, status mpi.CommandResponse_CommandStatus, diff --git a/internal/resource/resource_plugin_test.go b/internal/resource/resource_plugin_test.go index cebeb61b3b..49f1bb0425 100644 --- a/internal/resource/resource_plugin_test.go +++ b/internal/resource/resource_plugin_test.go @@ -133,7 +133,7 @@ func TestResource_Process_Apply(t *testing.T) { }, }, applyErr: nil, - topic: []string{bus.DataPlaneResponseTopic, bus.ConfigApplySuccessfulTopic}, + topic: []string{bus.ConfigApplySuccessfulTopic}, }, { name: "Test 2: Write Config Successful Topic - Fail Status", @@ -167,7 +167,10 @@ func TestResource_Process_Apply(t *testing.T) { resourcePlugin.Process(ctx, test.message) assert.Equal(t, test.topic[0], messagePipe.GetMessages()[0].Topic) - assert.Equal(t, test.topic[1], messagePipe.GetMessages()[1].Topic) + + if len(test.topic) > 1 { + assert.Equal(t, test.topic[1], messagePipe.GetMessages()[1].Topic) + } if test.applyErr != nil { response, ok := messagePipe.GetMessages()[0].Data.(*mpi.DataPlaneResponse) @@ -198,7 +201,7 @@ func TestResource_Process_Rollback(t *testing.T) { }, }, rollbackErr: nil, - topic: []string{bus.RollbackCompleteTopic, bus.DataPlaneResponseTopic}, + topic: []string{bus.RollbackCompleteTopic}, }, { name: "Test 2: Rollback Write Topic - Fail Status", @@ -211,7 +214,7 @@ func TestResource_Process_Rollback(t *testing.T) { }, }, rollbackErr: errors.New("error reloading"), - topic: []string{bus.RollbackCompleteTopic, bus.DataPlaneResponseTopic, bus.DataPlaneResponseTopic}, + topic: []string{bus.RollbackCompleteTopic, bus.DataPlaneResponseTopic}, }, } @@ -238,12 +241,15 @@ func TestResource_Process_Rollback(t *testing.T) { assert.Equal(tt, len(test.topic), len(messagePipe.GetMessages())) assert.Equal(t, test.topic[0], messagePipe.GetMessages()[0].Topic) - assert.Equal(t, test.topic[1], messagePipe.GetMessages()[1].Topic) + + if len(test.topic) > 1 { + assert.Equal(t, test.topic[1], messagePipe.GetMessages()[1].Topic) + } if test.rollbackErr != nil { - rollbackResponse, ok := messagePipe.GetMessages()[2].Data.(*mpi.DataPlaneResponse) + rollbackResponse, ok := messagePipe.GetMessages()[1].Data.(*mpi.DataPlaneResponse) assert.True(tt, ok) - assert.Equal(t, test.topic[2], messagePipe.GetMessages()[2].Topic) + assert.Equal(t, test.topic[1], messagePipe.GetMessages()[1].Topic) assert.Equal(tt, test.rollbackErr.Error(), rollbackResponse.GetCommandResponse().GetError()) } }) diff --git a/internal/watcher/watcher_plugin.go b/internal/watcher/watcher_plugin.go index 255df0b115..f062d736ae 100644 --- a/internal/watcher/watcher_plugin.go +++ b/internal/watcher/watcher_plugin.go @@ -150,32 +150,38 @@ func (w *Watcher) handleConfigApplyRequest(ctx context.Context, msg *bus.Message } func (w *Watcher) handleConfigApplySuccess(ctx context.Context, msg *bus.Message) { - data, ok := msg.Data.(string) + response, ok := msg.Data.(*mpi.DataPlaneResponse) if !ok { - slog.ErrorContext(ctx, "Unable to cast message payload to string", "payload", msg.Data, "topic", msg.Topic) + slog.ErrorContext(ctx, "Unable to cast message payload to *mpi.DataPlaneResponse", "payload", + msg.Data, "topic", msg.Topic) return } + instanceID := response.GetInstanceId() + w.instancesWithConfigApplyInProgress = slices.DeleteFunc( w.instancesWithConfigApplyInProgress, func(element string) bool { - return element == data + return element == instanceID }, ) w.fileWatcherService.SetEnabled(true) - w.instanceWatcherService.ReparseConfig(ctx, data) + w.instanceWatcherService.ReparseConfig(ctx, instanceID) } func (w *Watcher) handleRollbackComplete(ctx context.Context, msg *bus.Message) { - instanceID, ok := msg.Data.(string) + response, ok := msg.Data.(*mpi.DataPlaneResponse) if !ok { - slog.ErrorContext(ctx, "Unable to cast message payload to string", "payload", msg.Data, "topic", msg.Topic) + slog.ErrorContext(ctx, "Unable to cast message payload to *mpi.DataPlaneResponse", "payload", + msg.Data, "topic", msg.Topic) return } + instanceID := response.GetInstanceId() + w.instancesWithConfigApplyInProgress = slices.DeleteFunc( w.instancesWithConfigApplyInProgress, func(element string) bool { diff --git a/internal/watcher/watcher_plugin_test.go b/internal/watcher/watcher_plugin_test.go index 28dcc59616..d7c6830975 100644 --- a/internal/watcher/watcher_plugin_test.go +++ b/internal/watcher/watcher_plugin_test.go @@ -10,6 +10,9 @@ import ( "testing" "time" + "github.com/google/uuid" + "google.golang.org/protobuf/types/known/timestamppb" + "github.com/nginx/agent/v3/internal/watcher/health" "github.com/nginx/agent/v3/internal/watcher/instance" "github.com/nginx/agent/v3/internal/watcher/watcherfakes" @@ -130,9 +133,24 @@ func TestWatcher_Process_ConfigApplyRequestTopic(t *testing.T) { func TestWatcher_Process_ConfigApplySuccessfulTopic(t *testing.T) { ctx := context.Background() data := protos.GetNginxOssInstance([]string{}) + + response := &mpi.DataPlaneResponse{ + MessageMeta: &mpi.MessageMeta{ + MessageId: uuid.NewString(), + CorrelationId: "dfsbhj6-bc92-30c1-a9c9-85591422068e", + Timestamp: timestamppb.Now(), + }, + CommandResponse: &mpi.CommandResponse{ + Status: mpi.CommandResponse_COMMAND_STATUS_OK, + Message: "Config apply successful", + Error: "", + }, + InstanceId: data.GetInstanceMeta().GetInstanceId(), + } + message := &bus.Message{ Topic: bus.ConfigApplySuccessfulTopic, - Data: data.GetInstanceMeta().GetInstanceId(), + Data: response, } fakeWatcherService := &watcherfakes.FakeInstanceWatcherServiceInterface{} @@ -148,14 +166,29 @@ func TestWatcher_Process_ConfigApplySuccessfulTopic(t *testing.T) { func TestWatcher_Process_RollbackCompleteTopic(t *testing.T) { ctx := context.Background() - instanceID := "123" + ossInstance := protos.GetNginxOssInstance([]string{}) + + response := &mpi.DataPlaneResponse{ + MessageMeta: &mpi.MessageMeta{ + MessageId: uuid.NewString(), + CorrelationId: "dfsbhj6-bc92-30c1-a9c9-85591422068e", + Timestamp: timestamppb.Now(), + }, + CommandResponse: &mpi.CommandResponse{ + Status: mpi.CommandResponse_COMMAND_STATUS_OK, + Message: "Config apply successful", + Error: "", + }, + InstanceId: ossInstance.GetInstanceMeta().GetInstanceId(), + } + message := &bus.Message{ Topic: bus.RollbackCompleteTopic, - Data: instanceID, + Data: response, } watcherPlugin := NewWatcher(types.AgentConfig()) - watcherPlugin.instancesWithConfigApplyInProgress = []string{instanceID} + watcherPlugin.instancesWithConfigApplyInProgress = []string{ossInstance.GetInstanceMeta().GetInstanceId()} watcherPlugin.Process(ctx, message) diff --git a/nginx-agent.conf b/nginx-agent.conf index a90be6a9eb..24dd050694 100644 --- a/nginx-agent.conf +++ b/nginx-agent.conf @@ -28,9 +28,9 @@ allowed_directories: ## collector metrics settings # collector: -# exporters: # exporters -# - type: otlp # exporter type -# server: -# host: "127.0.0.1" # OTLP exporter server host -# port: 5643 # OTLP exporter server port -# tls: {} +# exporters: # exporters +# otlp_exporters: +# - server: +# host: "127.0.0.1" # OTLP exporter server host +# port: 5643 # OTLP exporter server port +# tls: {} diff --git a/pkg/tls/self_signed_cert.go b/pkg/tls/self_signed_cert.go index 65e57c4402..a7220549af 100644 --- a/pkg/tls/self_signed_cert.go +++ b/pkg/tls/self_signed_cert.go @@ -3,7 +3,7 @@ // 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 gencert generates self-signed TLS certificates. +// Package gencert generates a certificate authority (CA) and a server certificate signed by it. package tls import ( @@ -20,28 +20,32 @@ import ( "time" ) +// Predefined constants for Org and file permissions const ( - caOrganization = "F5 Inc. CA" - certOrganization = "F5 Inc." - certFilePermissions = 0o600 - keyFilePermissions = 0o600 + CaOrganization = "F5 Inc. CA" + CertOrganization = "F5 Inc." + CertFilePermissions = 0o600 + KeyFilePermissions = 0o600 ) -type certReq struct { - template *x509.Certificate - parent *x509.Certificate - publicKey *ecdsa.PublicKey - privateKey *ecdsa.PrivateKey +// CertReq contains a ECDSA key pair and 2 x509.Certificate templates, a server and parent. +// When generating a CA, template and parent are identical, making the CA "self-signed". +// When generating a server certificate, the `parent` is the CA template and `template` is the server. +type CertReq struct { + Template *x509.Certificate + Parent *x509.Certificate + PublicKey *ecdsa.PublicKey + PrivateKey *ecdsa.PrivateKey } // Returns x509 Certificate object and bytes in PEM format -func genCert(req *certReq) (*x509.Certificate, []byte, error) { +func GenerateCertificate(req *CertReq) (*x509.Certificate, []byte, error) { certBytes, createCertErr := x509.CreateCertificate( rand.Reader, - req.template, - req.parent, - req.publicKey, - req.privateKey, + req.Template, + req.Parent, + req.PublicKey, + req.PrivateKey, ) if createCertErr != nil { @@ -70,7 +74,7 @@ func GenerateCA(now time.Time, caCertPath string) (*x509.Certificate, *ecdsa.Pri // Create CA certificate template caTemplate := x509.Certificate{ SerialNumber: big.NewInt(1), - Subject: pkix.Name{Organization: []string{certOrganization}}, + Subject: pkix.Name{Organization: []string{CertOrganization}}, NotBefore: now.Add(-time.Minute), NotAfter: now.AddDate(1, 0, 0), // 1 year KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageCRLSign, @@ -81,14 +85,14 @@ func GenerateCA(now time.Time, caCertPath string) (*x509.Certificate, *ecdsa.Pri } // CA is self signed - caRequest := certReq{ - template: &caTemplate, - parent: &caTemplate, - publicKey: &caKeyPair.PublicKey, - privateKey: caKeyPair, + caRequest := CertReq{ + Template: &caTemplate, + Parent: &caTemplate, + PublicKey: &caKeyPair.PublicKey, + PrivateKey: caKeyPair, } - caCert, caCertPEM, caErr := genCert(&caRequest) + caCert, caCertPEM, caErr := GenerateCertificate(&caRequest) if caErr != nil { return &x509.Certificate{}, &ecdsa.PrivateKey{}, fmt.Errorf( "error generating certificate authority: %w", @@ -96,7 +100,7 @@ func GenerateCA(now time.Time, caCertPath string) (*x509.Certificate, *ecdsa.Pri } // Write the CA certificate to a file - writeCAErr := os.WriteFile(caCertPath, caCertPEM, certFilePermissions) + writeCAErr := os.WriteFile(caCertPath, caCertPEM, CertFilePermissions) if writeCAErr != nil { return &x509.Certificate{}, &ecdsa.PrivateKey{}, fmt.Errorf( "failed to write ca file: %w", @@ -107,7 +111,9 @@ func GenerateCA(now time.Time, caCertPath string) (*x509.Certificate, *ecdsa.Pri return caCert, caKeyPair, nil } -// Writes CA, Cert, Key to specified destinations. If cert files are already present, does nothing, returns true +// GenerateServerCerts creates a server CA, Cert and Key and writes them to specified destinations. +// Hostnames are a list of subject alternative names. +// If cert files are already present, does nothing, returns true. // nolint: revive func GenerateServerCerts(hostnames []string, caPath, certPath, keyPath string) (existingCert bool, err error) { // Check for and return existing cert if it already exists @@ -141,7 +147,7 @@ func GenerateServerCerts(hostnames []string, caPath, certPath, keyPath string) ( servTemplate := x509.Certificate{ SerialNumber: big.NewInt(1), Subject: pkix.Name{ - Organization: []string{caOrganization}, + Organization: []string{CaOrganization}, }, NotBefore: now.Add(-time.Minute), NotAfter: now.AddDate(1, 0, 0), // 1 year @@ -150,21 +156,21 @@ func GenerateServerCerts(hostnames []string, caPath, certPath, keyPath string) ( DNSNames: hostnames, } - servRequest := certReq{ - template: &servTemplate, - parent: caCert, - publicKey: &servKeyPair.PublicKey, - privateKey: caKeyPair, + servRequest := CertReq{ + Template: &servTemplate, + Parent: caCert, + PublicKey: &servKeyPair.PublicKey, + PrivateKey: caKeyPair, } // Generate server certficated signed by the CA - _, servCertPEM, servCertErr := genCert(&servRequest) + _, servCertPEM, servCertErr := GenerateCertificate(&servRequest) if servCertErr != nil { return false, fmt.Errorf("error generating server certificate: %w", servCertErr) } // Write the certificate to a file - writeCertErr := os.WriteFile(certPath, servCertPEM, certFilePermissions) + writeCertErr := os.WriteFile(certPath, servCertPEM, CertFilePermissions) if writeCertErr != nil { return false, fmt.Errorf("failed to write certificate file: %w", writeCertErr) } @@ -176,7 +182,7 @@ func GenerateServerCerts(hostnames []string, caPath, certPath, keyPath string) ( } b := pem.Block{Type: "EC PRIVATE KEY", Bytes: servKeyBytes} servKeyPEM := pem.EncodeToMemory(&b) - writeKeyErr := os.WriteFile(keyPath, servKeyPEM, keyFilePermissions) + writeKeyErr := os.WriteFile(keyPath, servKeyPEM, KeyFilePermissions) if writeKeyErr != nil { return false, fmt.Errorf("failed to write key file: %w", writeKeyErr) } diff --git a/test/config/agent/nginx-agent-otel-load.conf b/test/config/agent/nginx-agent-otel-load.conf index 8154721024..f2a2269cff 100644 --- a/test/config/agent/nginx-agent-otel-load.conf +++ b/test/config/agent/nginx-agent-otel-load.conf @@ -15,6 +15,7 @@ allowed_directories: - /usr/local/etc/nginx - /usr/share/nginx/modules - /var/run/nginx + - /var/log/nginx client: timeout: 10s @@ -22,10 +23,9 @@ client: collector: receivers: otlp_receivers: - - server: - host: "127.0.0.1" - port: 4317 - type: 0 + - server: + host: "127.0.0.1" + port: 4317 processors: batch: {} exporters: diff --git a/test/config/collector/test-opentelemetry-collector-agent.yaml b/test/config/collector/test-opentelemetry-collector-agent.yaml index 4e74a9207f..a4f5084a26 100644 --- a/test/config/collector/test-opentelemetry-collector-agent.yaml +++ b/test/config/collector/test-opentelemetry-collector-agent.yaml @@ -41,8 +41,12 @@ exporters: max_elapsed_time: 10m tls: insecure: true + auth: + authenticator: headers_setter prometheus: endpoint: "localhost:9876" + resource_to_telemetry_conversion: + enabled: true debug: verbosity: detailed sampling_initial: 5 @@ -50,6 +54,14 @@ exporters: extensions: health_check: endpoint: "localhost:1337" + headers_setter: + headers: + - action: "insert" + key: "authorization" + value: "key1" + - action: "upsert" + key: "uuid" + value: "1234" service: telemetry: @@ -59,6 +71,7 @@ service: error_output_paths: ["/var/log/nginx-agent/opentelemetry-collector-agent.log"] extensions: - health_check + - headers_setter pipelines: metrics: receivers: diff --git a/test/helpers/os_utils.go b/test/helpers/os_utils.go index 1a0a7ae1a7..5ff3dc9462 100644 --- a/test/helpers/os_utils.go +++ b/test/helpers/os_utils.go @@ -6,14 +6,9 @@ package helpers import ( - "encoding/json" "os" - "path" - "path/filepath" "testing" - "github.com/nginx/agent/v3/api/grpc/mpi/v1" - "github.com/stretchr/testify/require" ) @@ -45,19 +40,3 @@ func RemoveFileWithErrorCheck(t testing.TB, fileName string) { require.NoError(t, err) } - -func CreateCacheFiles(t testing.TB, cachePath string, cacheData map[string]*v1.FileMeta) { - t.Helper() - cache, err := json.MarshalIndent(cacheData, "", " ") - require.NoError(t, err) - - err = os.MkdirAll(path.Dir(cachePath), filePermission) - require.NoError(t, err) - - for _, file := range cacheData { - CreateFileWithErrorCheck(t, filepath.Dir(file.GetName()), filepath.Base(file.GetName())) - } - - err = os.WriteFile(cachePath, cache, filePermission) - require.NoError(t, err) -} diff --git a/test/load/nginx_agent_process_collector.go b/test/load/nginx_agent_process_collector.go index 45de33a5c3..6293b7849d 100644 --- a/test/load/nginx_agent_process_collector.go +++ b/test/load/nginx_agent_process_collector.go @@ -244,6 +244,12 @@ func (cp *agentProcessCollector) Stop() (stopped bool, err error) { cp.isStopped = true + out, catError := exec.Command("cat", "/var/log/nginx-agent/agent.log").Output() + if catError != nil { + log.Println("Error reading /var/log/nginx-agent/agent.log: %w", catError) + } + log.Printf("\nNGINX agent logs:\n%s\n", out) + log.Printf("Gracefully terminating %s pid=%d, sending SIGTEM...", cp.name, cp.cmd.Process.Pid) // Notify resource monitor to stop. diff --git a/test/mock/collector/docker-compose.yaml b/test/mock/collector/docker-compose.yaml index 895e6dda1b..9330c9b4e6 100644 --- a/test/mock/collector/docker-compose.yaml +++ b/test/mock/collector/docker-compose.yaml @@ -26,10 +26,8 @@ services: - metrics otel-collector: - image: otel/opentelemetry-collector-contrib:0.99.0 + image: mock-collector container_name: mock-collector-otel-collector - restart: on-failure - command: [ "--config=/etc/otel-collector.yaml" ] ports: - 4320:4317 - 9775:9090 diff --git a/test/mock/collector/mock-collector/Dockerfile b/test/mock/collector/mock-collector/Dockerfile new file mode 100644 index 0000000000..d220e9f2f2 --- /dev/null +++ b/test/mock/collector/mock-collector/Dockerfile @@ -0,0 +1,6 @@ +FROM golang:bookworm + +WORKDIR /mock-collector +COPY ./test/mock/collector/mock-collector/ ./ + +CMD ["go", "run", "main.go"] diff --git a/test/mock/collector/mock-collector/auth/auth.go b/test/mock/collector/mock-collector/auth/auth.go new file mode 100644 index 0000000000..9b30bfb26c --- /dev/null +++ b/test/mock/collector/mock-collector/auth/auth.go @@ -0,0 +1,71 @@ +// 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 auth + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/extension" + "go.opentelemetry.io/collector/extension/auth" + "go.uber.org/zap" +) + +const ( + AuthenticatorName = "headers_check" +) + +var ( + aType = component.MustNewType(AuthenticatorName) + HeadersCheckID = component.MustNewID(AuthenticatorName) +) + +type HeadersCheck struct { + AuthenticatorID component.ID `mapstructure:"authenticator"` + logger *zap.SugaredLogger +} + +type Option func(*HeadersCheck) + +// Ensure that the authenticator implements the auth.Server interface. +var _ auth.Server = (*HeadersCheck)(nil) + +func NewFactory() extension.Factory { + return extension.NewFactory( + aType, + CreateDefaultConfig, + CreateAuthExtensionFunc, + component.StabilityLevelBeta, + ) +} + +func (a *HeadersCheck) Start(_ context.Context, _ component.Host) error { + return nil +} + +func (a *HeadersCheck) Shutdown(_ context.Context) error { + return nil +} + +func (a *HeadersCheck) Authenticate(ctx context.Context, headers map[string][]string) (context.Context, error) { + a.logger.Info("Headers", zap.Any("headers", headers)) + return ctx, nil +} + +func CreateAuthExtensionFunc( + _ context.Context, + setting extension.Settings, + _ component.Config, +) (extension.Extension, error) { + logger := setting.Logger.Sugar() + + a := &HeadersCheck{ + AuthenticatorID: setting.ID, + logger: logger, + } + + return a, nil +} diff --git a/test/mock/collector/mock-collector/auth/config.go b/test/mock/collector/mock-collector/auth/config.go new file mode 100644 index 0000000000..95f6d08922 --- /dev/null +++ b/test/mock/collector/mock-collector/auth/config.go @@ -0,0 +1,24 @@ +// 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 auth + +import ( + "go.opentelemetry.io/collector/component" +) + +type ServerConfig struct { + AuthenticatorID string `mapstructure:"authenticator"` +} + +type Config struct { + AuthenticatorID component.ID `mapstructure:",squash"` +} + +func CreateDefaultConfig() component.Config { + return &Config{ + AuthenticatorID: HeadersCheckID, + } +} diff --git a/test/mock/collector/mock-collector/go.mod b/test/mock/collector/mock-collector/go.mod new file mode 100644 index 0000000000..adc289f63c --- /dev/null +++ b/test/mock/collector/mock-collector/go.mod @@ -0,0 +1,141 @@ +module go.opentelemetry.io/collector/cmd/builder + +go 1.22.0 + +toolchain go1.23.2 + +require ( + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.111.0 + go.opentelemetry.io/collector/component v0.111.0 + go.opentelemetry.io/collector/confmap v1.17.0 + go.opentelemetry.io/collector/confmap/provider/envprovider v1.17.0 + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.17.0 + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.17.0 + go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.17.0 + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.17.0 + go.opentelemetry.io/collector/connector v0.111.0 + go.opentelemetry.io/collector/exporter v0.111.0 + go.opentelemetry.io/collector/exporter/debugexporter v0.111.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.111.0 + go.opentelemetry.io/collector/extension v0.111.0 + go.opentelemetry.io/collector/extension/auth v0.111.0 + go.opentelemetry.io/collector/otelcol v0.111.0 + go.opentelemetry.io/collector/processor v0.111.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.111.0 + go.opentelemetry.io/collector/receiver v0.111.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.111.0 + go.uber.org/zap v1.27.0 +) + +require ( + github.com/beorn7/perks v1.0.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/ebitengine/purego v0.8.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.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.2.6 // indirect + github.com/go-viper/mapstructure/v2 v2.1.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.10 // 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/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // 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/pkg/resourcetotelemetry v0.111.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.111.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/prometheus/client_golang v1.20.4 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.60.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/shirou/gopsutil/v4 v4.24.9 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/collector v0.111.0 // indirect + go.opentelemetry.io/collector/client v1.17.0 // indirect + go.opentelemetry.io/collector/component/componentprofiles v0.111.0 // indirect + go.opentelemetry.io/collector/component/componentstatus v0.111.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.111.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.17.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.111.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.111.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.17.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.17.0 // indirect + go.opentelemetry.io/collector/config/configretry v1.17.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.111.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.17.0 // indirect + go.opentelemetry.io/collector/config/internal v0.111.0 // indirect + go.opentelemetry.io/collector/connector/connectorprofiles v0.111.0 // indirect + go.opentelemetry.io/collector/consumer v0.111.0 // indirect + go.opentelemetry.io/collector/consumer/consumerprofiles v0.111.0 // indirect + go.opentelemetry.io/collector/consumer/consumertest v0.111.0 // indirect + go.opentelemetry.io/collector/exporter/exporterprofiles v0.111.0 // indirect + go.opentelemetry.io/collector/extension/experimental/storage v0.111.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.111.0 // indirect + go.opentelemetry.io/collector/featuregate v1.17.0 // indirect + go.opentelemetry.io/collector/internal/globalgates v0.111.0 // indirect + go.opentelemetry.io/collector/internal/globalsignal v0.111.0 // indirect + go.opentelemetry.io/collector/pdata v1.17.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.111.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.111.0 // indirect + go.opentelemetry.io/collector/pipeline v0.111.0 // indirect + go.opentelemetry.io/collector/processor/processorprofiles v0.111.0 // indirect + go.opentelemetry.io/collector/receiver/receiverprofiles v0.111.0 // indirect + go.opentelemetry.io/collector/semconv v0.111.0 // indirect + go.opentelemetry.io/collector/service v0.111.0 // indirect + go.opentelemetry.io/contrib/config v0.10.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.30.0 // indirect + go.opentelemetry.io/otel v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.52.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.6.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.30.0 // indirect + go.opentelemetry.io/otel/log v0.6.0 // indirect + go.opentelemetry.io/otel/metric v1.30.0 // indirect + go.opentelemetry.io/otel/sdk v1.30.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.30.0 // indirect + go.opentelemetry.io/otel/trace v1.30.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.67.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/test/mock/collector/mock-collector/go.sum b/test/mock/collector/mock-collector/go.sum new file mode 100644 index 0000000000..bc470f44fa --- /dev/null +++ b/test/mock/collector/mock-collector/go.sum @@ -0,0 +1,539 @@ +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/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= +github.com/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/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/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/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/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/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= +github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +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/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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 h1:N+3sFI5GUjRKBi+i0TxYVST9h4Ie192jJWpHvthBBgg= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= +github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= +github.com/digitalocean/godo v1.118.0 h1:lkzGFQmACrVCp7UqH1sAi4JK/PWwlc5aaxubgorKmC4= +github.com/digitalocean/godo v1.118.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.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/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/ebitengine/purego v0.8.0 h1:JbqvnEzRvPpxhCJzJJ2y0RbiZ8nyjccVUrSM3q+GvvE= +github.com/ebitengine/purego v0.8.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +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.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 v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +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/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.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +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= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +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.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +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-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-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= +github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= +github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/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/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/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/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +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.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +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.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.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= +github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= +github.com/gophercloud/gophercloud v1.13.0 h1:8iY9d1DAbzMW6Vok1AxbbK5ZaUjzMp0tdyt4fX9IeJ0= +github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +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/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.2 h1:aYyRn8EdE2mSfG14S1+L9Qkjtz8RzmaWh6AcNGRNwPw= +github.com/hashicorp/consul/api v1.29.2/go.mod h1:0YObcaLNDSbtlgzIRtmRXI1ZkeuK0trCBxwZQ4MYnIk= +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.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.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.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +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.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-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= +github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= +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/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/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.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0= +github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +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/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/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +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/linode/linodego v1.37.0 h1:B/2Spzv9jYXzKA+p+GD8fVCNJ7Wuw6P91ZDD9eCkkso= +github.com/linode/linodego v1.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +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.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +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/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= +github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +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 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= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +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 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +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-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-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.111.0 h1:VAXpIvh4yqPUgvsEP6rX5/GMuowJgL8gMoEVr3cgh5E= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.111.0/go.mod h1:J3jMd98FFiMSiYsk2VX5SV821hcaif/juOVke+nLvP4= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.111.0 h1:QhEwQTGTXitMPbmyloNfLVz1r9YzZ8izJUJivI8obzs= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.111.0/go.mod h1:I7nEkR7TDPFw162jYtPJZVevkniQfQ0FLIFuu2RGK3A= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.111.0 h1:Hh3Lt6GIw/jMfCSJ5XjBoZRmjZ1pbJJu6Xi7WrDTUi0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.111.0/go.mod h1:rQ9lQhijXIJIT5UGuwiKoEcWW6bdWJ4fnO+PndfuYEw= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.111.0 h1:kUUO8VNv/d9Tpx0NvOsRnUsz/JvZ8SWRnK+vT0cNjuU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.111.0/go.mod h1:SstR8PglIFBVGCZHS69bwJGl6TaCQQ5aLSEoas/8SRA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.111.0 h1:RSbk3ty1D9zeBC/elcqVdJoZjpAa331Wha99yNHnH6w= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.111.0/go.mod h1:iDBwbN0by4Y75X6j5PuRoJL5MpoaDv0l7s8dHFQHJPU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.111.0 h1:BCev4nJfHH2u9AsWFfxR1o1Vt5HoW9myN4jaktZInRA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.111.0/go.mod h1:xJ8w6JN/tfRpUXTU6jx/bYmTIcy7OTz7PVFVR/SdqC8= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.111.0 h1:abeLe2WANVWpnNua41Aa+RTmYYGs0gk1oQRd2/XH7Uo= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.111.0/go.mod h1:Nij85WmJr/+q0HeAvGulEYxFE+PMlhFelPWN6yzCuuw= +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/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= +github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= +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.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/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +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.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA= +github.com/prometheus/common v0.60.0/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.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.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.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/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnAOh7ntQvUkOFmkMqPU= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/shirou/gopsutil/v4 v4.24.9 h1:KIV+/HaHD5ka5f570RZq+2SaeFsb/pq+fp2DGNWYoOI= +github.com/shirou/gopsutil/v4 v4.24.9/go.mod h1:3fkaHNeYsUFCGZ8+9vZVWtbyM1k2eRnlL+bWO8Bxa/Q= +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 v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +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/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= +github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +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.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/collector v0.111.0 h1:D3LJTYrrK2ac94E2PXPSbVkArqxbklbCLsE4MAJQdRo= +go.opentelemetry.io/collector v0.111.0/go.mod h1:eZi4Z1DmHy+sVqbUI8dZNvhrH7HZIlX+0AKorOtv6nE= +go.opentelemetry.io/collector/client v1.17.0 h1:eJB4r4nPY0WrQ6IQEEbOPCOfQU7N15yzZud9y5fKfms= +go.opentelemetry.io/collector/client v1.17.0/go.mod h1:egG3tOG68zvC04hgl6cW2H/oWCUCCdDWtL4WpbcSUys= +go.opentelemetry.io/collector/component v0.111.0 h1:AiDIrhkq6sbHnU9Rhq6t4DC4Gal43bryd1+NTJNojAQ= +go.opentelemetry.io/collector/component v0.111.0/go.mod h1:wYwbRuhzK5bm5x1bX+ukm1tT50QXYLs4MKwzyfiVGoE= +go.opentelemetry.io/collector/component/componentprofiles v0.111.0 h1:yT3Sa833G9GMiXkAOuYi30afd/5vTmDQpZo6+X/XjXM= +go.opentelemetry.io/collector/component/componentprofiles v0.111.0/go.mod h1:v9cm6ndumcbCSqZDBs0vRReRW7KSYax1RZVhs/CiZCo= +go.opentelemetry.io/collector/component/componentstatus v0.111.0 h1:DojO8TbkysTtEoxzN6fJqhgCsu0QhxgJ9R+1bitnowM= +go.opentelemetry.io/collector/component/componentstatus v0.111.0/go.mod h1:wKozN6s9dykUB9aLSBXSPT9SJ2fckNvGSFZx4fRZbSY= +go.opentelemetry.io/collector/config/configauth v0.111.0 h1:0CcgX4TzK5iu2YtryIu3al8lNI+9fqjbGoyvAFk9ZCw= +go.opentelemetry.io/collector/config/configauth v0.111.0/go.mod h1:5oyYNL3gnYMYNdNsEjFvA2Tdc1yjG8L+HQFIjPo6kK8= +go.opentelemetry.io/collector/config/configcompression v1.17.0 h1:5CzLHTPOgHaKod1ZQLYs0o7GZDBhdsLQRm8Lcbo79vU= +go.opentelemetry.io/collector/config/configcompression v1.17.0/go.mod h1:pnxkFCLUZLKWzYJvfSwZnPrnm0twX14CYj2ADth5xiU= +go.opentelemetry.io/collector/config/configgrpc v0.111.0 h1:XwHBWCP0m/d6YZ0VZltzVvnz5hDB9ik7sPRjJIdmjUk= +go.opentelemetry.io/collector/config/configgrpc v0.111.0/go.mod h1:K9OLwZM8dGNL1Jul/FGxlRsnLd1umgDyA+yxq2BNXUs= +go.opentelemetry.io/collector/config/confighttp v0.111.0 h1:nZJFHKYYeCasyhhFC71iZf6GAs6pfFcNOga6b8+lFvc= +go.opentelemetry.io/collector/config/confighttp v0.111.0/go.mod h1:heE5JjcLDiH8fMULf55QL2oI9+8Ct58Vq/QfP7TV684= +go.opentelemetry.io/collector/config/confignet v1.17.0 h1:cBmDdiPuIVrHiecgCKyXhRYmDOz9Do5IM7O1JhbB3es= +go.opentelemetry.io/collector/config/confignet v1.17.0/go.mod h1:o3v4joAEjvLwntqexg5ixMqRrU1+Vst+jWuCUaBNgOg= +go.opentelemetry.io/collector/config/configopaque v1.17.0 h1:wHhUgJhmDgNd6M7GW8IU5HjWi/pNmBEe9jBhavoR45g= +go.opentelemetry.io/collector/config/configopaque v1.17.0/go.mod h1:6zlLIyOoRpJJ+0bEKrlZOZon3rOp5Jrz9fMdR4twOS4= +go.opentelemetry.io/collector/config/configretry v1.17.0 h1:9GaiNKgUDx5by+A0aHKojw1BilHSK+8wq2LOmnynN00= +go.opentelemetry.io/collector/config/configretry v1.17.0/go.mod h1:KvQF5cfphq1rQm1dKR4eLDNQYw6iI2fY72NMZVa+0N0= +go.opentelemetry.io/collector/config/configtelemetry v0.111.0 h1:Q3TJRM2A3FIDjIvzWa3uFArsdFN0I/0GzcWynHjC+oY= +go.opentelemetry.io/collector/config/configtelemetry v0.111.0/go.mod h1:R0MBUxjSMVMIhljuDHWIygzzJWQyZHXXWIgQNxcFwhc= +go.opentelemetry.io/collector/config/configtls v1.17.0 h1:5DPgmBgpKEopLGmkjaihZHVA/8yH0LGoOrUZlb86T0Q= +go.opentelemetry.io/collector/config/configtls v1.17.0/go.mod h1:xUV5/xAHJbwrCuT2rGurBGSUqyFFAVVBcQ5DJAENeCc= +go.opentelemetry.io/collector/config/internal v0.111.0 h1:HTrN9xCpX42xlyDskWbhA/2NkSjMasxNEuGkmjjq7Q8= +go.opentelemetry.io/collector/config/internal v0.111.0/go.mod h1:yC7E4h1Uj0SubxcFImh6OvBHFTjMh99+A5PuyIgDWqc= +go.opentelemetry.io/collector/confmap v1.17.0 h1:5UKHtPGtzNGaOGBsJ6aFpvsKElNUXOVuErBfC0eTWLM= +go.opentelemetry.io/collector/confmap v1.17.0/go.mod h1:GrIZ12P/9DPOuTpe2PIS51a0P/ZM6iKtByVee1Uf3+k= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.17.0 h1:KH0ABOBfSPp5XZtHkoXeI9wKoOD9B0eN6TDo08SwN/c= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.17.0/go.mod h1:jyFbV9hLrYJf2zNjqcpzkzB6zmPj/Ohr+S+vmPuxyMY= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.17.0 h1:UyMO2ddtO7GKuFjrkR51IxmeBuRJrb1KKatu60oosxI= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.17.0/go.mod h1:SCJ8zvuuaOwQJk+zI87XSuc+HbquP2tsYb9aPlfeeRg= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.17.0 h1:R/U0uWAyppNrxvF+piqhnhcrPSNz3wnwHyEIRCbrmh0= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.17.0/go.mod h1:3mtUk7wwDQyPUsHtCOLi2v0uSZWfC00BhOhqHs4CWs4= +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.17.0 h1:FtKwwHS8NSNJWrhE7JsFlYhe+2GojENfOQbhQMSTyRo= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.17.0/go.mod h1:9/R8ucfVQEEEHMv9b7M6rSB8nF2k+MfIO93vbDEsaMU= +go.opentelemetry.io/collector/connector v0.111.0 h1:dOaJRO27LyX4ZnkZA51namo2V5idRWvWoMVf4b7obro= +go.opentelemetry.io/collector/connector v0.111.0/go.mod h1:gPwxA1SK+uraSTpX20MG/cNc+axhkBm8+B6z6hh6hYg= +go.opentelemetry.io/collector/connector/connectorprofiles v0.111.0 h1:tJ4+hcWRhknw+cRw6d6dI4CyX3/puqnd1Rg9+mWdwHU= +go.opentelemetry.io/collector/connector/connectorprofiles v0.111.0/go.mod h1:LdfE8hNYcEb+fI5kZp4w3ZGlTLFAmvHAPtTZxS6TZ38= +go.opentelemetry.io/collector/consumer v0.111.0 h1:d2kRTDnu+p0q4D5fTU+Pk59KRm5F2JRYrk30Ep5j0xI= +go.opentelemetry.io/collector/consumer v0.111.0/go.mod h1:FjY9bPbVkFZLKKxnNbGsIqaz3lcFDKGf+7wxA1uCugs= +go.opentelemetry.io/collector/consumer/consumerprofiles v0.111.0 h1:w9kGdTaXdwD/ZtbxVOvuYQEFKBX3THQgEz/enQnMt9s= +go.opentelemetry.io/collector/consumer/consumerprofiles v0.111.0/go.mod h1:Ebt1jDdrQb3G2sNHrWHNr5wS3UJ9k3h8LHCqUPTbxLY= +go.opentelemetry.io/collector/consumer/consumertest v0.111.0 h1:ZEikGRPdrhVAq7xhJVc8WapRBVN/CdPnMEnXgpRGu1U= +go.opentelemetry.io/collector/consumer/consumertest v0.111.0/go.mod h1:EHPrn8ovcTGdTDlCEi1grOXSP3jUUYU0zvl92uA5L+4= +go.opentelemetry.io/collector/exporter v0.111.0 h1:NpiP6xXGOmSi59RlB5gGTB+PtCLldVeK3vCQBJPW0sU= +go.opentelemetry.io/collector/exporter v0.111.0/go.mod h1:FjO80zGWZjqXil8vM1MS8gyxxzZ29WmChTNV2y9xjHo= +go.opentelemetry.io/collector/exporter/debugexporter v0.111.0 h1:KiypGuW+JG1gV9l6pvSEIMKwn+MLJn0Ol62HMe5ytr4= +go.opentelemetry.io/collector/exporter/debugexporter v0.111.0/go.mod h1:7ihw3KDcvrY5kXIRNxB64Pz6kguf5Q0x9mJAvbBLT5Y= +go.opentelemetry.io/collector/exporter/exporterprofiles v0.111.0 h1:fpIRPzqsaEtbVip/wsU6h/GMGISo7UjiiYV61MOMEpQ= +go.opentelemetry.io/collector/exporter/exporterprofiles v0.111.0/go.mod h1:NGUTQd1fminFnw289fVQFN4dxdyedK4GTTrJUc9gCtw= +go.opentelemetry.io/collector/exporter/otlpexporter v0.111.0 h1:eOyd1InTuymfIP4oMzJki28JjpGQzOEK6Y0YlI6pwgA= +go.opentelemetry.io/collector/exporter/otlpexporter v0.111.0/go.mod h1:nOUveQ4KWFqlCA6b0L5DXMosZCcNtit8abEuLHwBaUM= +go.opentelemetry.io/collector/extension v0.111.0 h1:oagGQS3k6Etnm5N5OEkfIWrX4/77t/ZP+B0xfTPUVm8= +go.opentelemetry.io/collector/extension v0.111.0/go.mod h1:ELCpDNpS2qb/31Z8pCMmqTkzfnUV3CanQZMwLW+GCMI= +go.opentelemetry.io/collector/extension/auth v0.111.0 h1:V9DfnMsKdVfsQMeGR5H/nAYHlZnr1Td75kkJOKbCevk= +go.opentelemetry.io/collector/extension/auth v0.111.0/go.mod h1:4O5JQqEdAWuq4giicIy6DKlgkKTC0qgVEJm44RhviZY= +go.opentelemetry.io/collector/extension/experimental/storage v0.111.0 h1:kUJSFjm6IQ6nmcJlfSFPvcEO/XeOP9gJY0Qz9O98DKg= +go.opentelemetry.io/collector/extension/experimental/storage v0.111.0/go.mod h1:qQGvl8Kz2W8b7QywtE8GNqWJMDBo47cjoiIXYuE+/zM= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.111.0 h1:Ps2/2TUbAkxgZu1YxSxDweZDLJx5x7CyNKCINZkLFtY= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.111.0/go.mod h1:q4kBSWsOX62hAp7si+Y0Y0ZXWyCpXjiRuWWz7IL/MDI= +go.opentelemetry.io/collector/extension/zpagesextension v0.111.0 h1:X+YXkJ3kX8c3xN/Mfiqc/gKB7NaQnG4Cge9R60lKOyw= +go.opentelemetry.io/collector/extension/zpagesextension v0.111.0/go.mod h1:v5u5Ots6HgbhKsvRXB+SF9cmVTgkUATNiejHbpsa0rY= +go.opentelemetry.io/collector/featuregate v1.17.0 h1:vpfXyWe7DFqCsDArsR9rAKKtVpt72PKjzjeqPegViws= +go.opentelemetry.io/collector/featuregate v1.17.0/go.mod h1:47xrISO71vJ83LSMm8+yIDsUbKktUp48Ovt7RR6VbRs= +go.opentelemetry.io/collector/internal/globalgates v0.111.0 h1:pPf/U401i/bEJ8ucbYMyqOdkujyZ92Gbm6RFkJrDvBc= +go.opentelemetry.io/collector/internal/globalgates v0.111.0/go.mod h1:HqIBKc8J5Vccn93gkN1uaVK42VbVsuVyjmo5b1MORZo= +go.opentelemetry.io/collector/internal/globalsignal v0.111.0 h1:oq0nSD+7K2Q1Fx5d3s6lPRdKZeTL0FEg4sIaR7ZJzIc= +go.opentelemetry.io/collector/internal/globalsignal v0.111.0/go.mod h1:GqMXodPWOxK5uqpX8MaMXC2389y2XJTa5nPwf8FYDK8= +go.opentelemetry.io/collector/otelcol v0.111.0 h1:RcS1/BDsEBGdI4YjosdElxYwsA2tTtiYEuWjEF0p8vk= +go.opentelemetry.io/collector/otelcol v0.111.0/go.mod h1:B/ri/CwsW7zeLXkCcB3XtarxjJ80eIC+z8guGhFFpis= +go.opentelemetry.io/collector/pdata v1.17.0 h1:z8cjjT2FThAehWu5fbF48OnZyK5q8xd1UhC4XszDo0w= +go.opentelemetry.io/collector/pdata v1.17.0/go.mod h1:yZaQ9KZAm/qie96LTygRKxOXMq0/54h8OW7330ycuvQ= +go.opentelemetry.io/collector/pdata/pprofile v0.111.0 h1:4if6rItcX8a6X4bIh6lwQnlE+ncKXQaIim7F5O7ZA58= +go.opentelemetry.io/collector/pdata/pprofile v0.111.0/go.mod h1:iBwrNFB6za1qspy46ZE41H3MmcxUogn2AuYbrWdoMd8= +go.opentelemetry.io/collector/pdata/testdata v0.111.0 h1:Fqyf1NJ0az+HbsvKSCNw8pfa1Y6c4FhZwlMK4ZulG0s= +go.opentelemetry.io/collector/pdata/testdata v0.111.0/go.mod h1:7SypOzbVtRsCkns6Yxa4GztnkVGkk7b9fW24Ow75q5s= +go.opentelemetry.io/collector/pipeline v0.111.0 h1:qENDGvWWnDXguEfmj8eO+5kr8Y6XFKytU5SuMinz3Ls= +go.opentelemetry.io/collector/pipeline v0.111.0/go.mod h1:ZZMU3019geEU283rTW5M/LkcqLqHp/YI2Nl6/Vp68PQ= +go.opentelemetry.io/collector/processor v0.111.0 h1:85Llb9ekzzvzAXgFaw/n7LHFJ5QAjeOulGJlDLEAR3g= +go.opentelemetry.io/collector/processor v0.111.0/go.mod h1:78Z4f96j9trPFZIRCiQk6nVRo6vua4cW9VYNfHTBsvo= +go.opentelemetry.io/collector/processor/batchprocessor v0.111.0 h1:JoBjX0LjmQ3n22o54sxAN9T6sgxumBLDqq0RElvYAVc= +go.opentelemetry.io/collector/processor/batchprocessor v0.111.0/go.mod h1:8Dw89aInFh4dX3A0iyIcpbQ1A/8hVWtxjrJKyAOb9TQ= +go.opentelemetry.io/collector/processor/processorprofiles v0.111.0 h1:QxnwbqClJvS7zDWgsIaqqDs5YsmHgFvmZKQsmoLTqJM= +go.opentelemetry.io/collector/processor/processorprofiles v0.111.0/go.mod h1:8qPd8Af0XX7Wlupe8JHmdhkKMiiJ5AO7OEFYW3fN0CQ= +go.opentelemetry.io/collector/receiver v0.111.0 h1:6cRHZ9cUxYfRPkArUCkIhoo7Byf6tq/2qvbMIKlhG3s= +go.opentelemetry.io/collector/receiver v0.111.0/go.mod h1:QSl/n9ikDP+6n39QcRY/VLjwQI0qbT1RQp512uBQl3g= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.111.0 h1:VsQ55DvHvjYop+wbpY6qCSF0cfoMNMZEd0pANa5l+9Y= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.111.0/go.mod h1:/zUX2GHa7CIeqGRl+hpQk3zQ1QCaUpBK42XGqrXAbzQ= +go.opentelemetry.io/collector/receiver/receiverprofiles v0.111.0 h1:oYLAdGMQQR7gB6wVkbV0G4EMsrmiOs3O0qf3hh/3avw= +go.opentelemetry.io/collector/receiver/receiverprofiles v0.111.0/go.mod h1:M/OfdEGnvyB+fSTSW4RPKj5N06FXL8oKSIf60FlrKmM= +go.opentelemetry.io/collector/semconv v0.111.0 h1:ELleMtLBzeZ3xhfhYPmFcLc0hJMqRxhOB0eY60WLivw= +go.opentelemetry.io/collector/semconv v0.111.0/go.mod h1:zCJ5njhWpejR+A40kiEoeFm1xq1uzyZwMnRNX6/D82A= +go.opentelemetry.io/collector/service v0.111.0 h1:6yGjjbZvlYbir+vzi/9ACF965m8i96ScPTjpVvki3ms= +go.opentelemetry.io/collector/service v0.111.0/go.mod h1:tti8TAosPuRj51/bbrSvf6OIJoSyTkywEvTdY/fAuwY= +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.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= +go.opentelemetry.io/contrib/propagators/b3 v1.30.0 h1:vumy4r1KMyaoQRltX7cJ37p3nluzALX9nugCjNNefuY= +go.opentelemetry.io/contrib/propagators/b3 v1.30.0/go.mod h1:fRbvRsaeVZ82LIl3u0rIvusIel2UUf+JcaaIpy5taho= +go.opentelemetry.io/contrib/zpages v0.55.0 h1:F+xj261Ulwl79QC+2O+IO1b3NbwppUDwN+7LbDSdQcY= +go.opentelemetry.io/contrib/zpages v0.55.0/go.mod h1:dDqDGDfbXSjt/k9orZk4Huulvz1letX1YWTKts5GQpo= +go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= +go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.30.0 h1:WypxHH02KX2poqqbaadmkMYalGyy/vil4HE4PM4nRJc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.30.0/go.mod h1:U79SV99vtvGSEBeeHnpgGJfTsnsdkWLpPN/CcHAzBSI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTiGDLUvVYaTFbAvCkVYIYcvwKt3G7OLoN77NUs/8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= +go.opentelemetry.io/otel/exporters/prometheus v0.52.0 h1:kmU3H0b9ufFSi8IQCcxack+sWUblKkFbqWYs6YiACGQ= +go.opentelemetry.io/otel/exporters/prometheus v0.52.0/go.mod h1:+wsAp2+JhuGXX7YRkjlkx6hyWY3ogFPfNA4x3nyiAh0= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.6.0 h1:bZHOb8k/CwwSt0DgvgaoOhBXWNdWqFWaIsGTtg1H3KE= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.6.0/go.mod h1:XlV163j81kDdIt5b5BXCjdqVfqJFy/LJrHA697SorvQ= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.30.0 h1:IyFlqNsi8VT/nwYlLJfdM0y1gavxGpEvnf6FtVfZ6X4= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.30.0/go.mod h1:bxiX8eUeKoAEQmbq/ecUT8UqZwCjZW52yJrXJUSozsk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.30.0 h1:kn1BudCgwtE7PxLqcZkErpD8GKqLZ6BSzeW9QihQJeM= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.30.0/go.mod h1:ljkUDtAMdleoi9tIG1R6dJUpVwDcYjw3J2Q6Q/SuiC0= +go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= +go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= +go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= +go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= +go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= +go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= +go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= +go.opentelemetry.io/otel/sdk/metric v1.30.0 h1:QJLT8Pe11jyHBHfSAgYH7kEmT24eX792jZO1bo4BXkM= +go.opentelemetry.io/otel/sdk/metric v1.30.0/go.mod h1:waS6P3YqFNzeP01kuo/MBBYqaoBJl7efRQHOaydhy1Y= +go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= +go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +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.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +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/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +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.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +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.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +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-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.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.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.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +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.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +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.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +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.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw= +google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/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= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= +k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= +k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= +k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/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-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +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.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.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/test/mock/collector/mock-collector/main.go b/test/mock/collector/mock-collector/main.go new file mode 100644 index 0000000000..b7e948467b --- /dev/null +++ b/test/mock/collector/mock-collector/main.go @@ -0,0 +1,114 @@ +// 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 main + +import ( + "log" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter" + "go.opentelemetry.io/collector/cmd/builder/auth" + "go.opentelemetry.io/collector/connector" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/debugexporter" + "go.opentelemetry.io/collector/exporter/otlpexporter" + "go.opentelemetry.io/collector/extension" + "go.opentelemetry.io/collector/processor" + "go.opentelemetry.io/collector/processor/batchprocessor" + "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/collector/receiver/otlpreceiver" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/confmap" + envprovider "go.opentelemetry.io/collector/confmap/provider/envprovider" + fileprovider "go.opentelemetry.io/collector/confmap/provider/fileprovider" + httpprovider "go.opentelemetry.io/collector/confmap/provider/httpprovider" + httpsprovider "go.opentelemetry.io/collector/confmap/provider/httpsprovider" + yamlprovider "go.opentelemetry.io/collector/confmap/provider/yamlprovider" + "go.opentelemetry.io/collector/otelcol" +) + +func main() { + println("Starting mock collector") + + info := component.BuildInfo{ + Command: "mock-collector", + Description: "Mock OTel Collector distribution for Developers", + Version: "1.0.0", + } + + set := otelcol.CollectorSettings{ + BuildInfo: info, + Factories: components, + ConfigProviderSettings: otelcol.ConfigProviderSettings{ + ResolverSettings: confmap.ResolverSettings{ + ProviderFactories: []confmap.ProviderFactory{ + envprovider.NewFactory(), + fileprovider.NewFactory(), + httpprovider.NewFactory(), + httpsprovider.NewFactory(), + yamlprovider.NewFactory(), + }, + URIs: []string{"/etc/otel-collector.yaml"}, + }, + }, + } + + if err := runInteractive(set); err != nil { + log.Fatal(err) + } +} + +func runInteractive(params otelcol.CollectorSettings) error { + cmd := otelcol.NewCommand(params) + if err := cmd.Execute(); err != nil { + log.Fatalf("collector server run finished with error: %v", err) + } + + return nil +} + +func components() (otelcol.Factories, error) { + var err error + factories := otelcol.Factories{} + + factories.Extensions, err = extension.MakeFactoryMap( + auth.NewFactory(), + ) + if err != nil { + return otelcol.Factories{}, err + } + + factories.Receivers, err = receiver.MakeFactoryMap( + otlpreceiver.NewFactory(), + ) + if err != nil { + return otelcol.Factories{}, err + } + + factories.Exporters, err = exporter.MakeFactoryMap( + debugexporter.NewFactory(), + otlpexporter.NewFactory(), + prometheusexporter.NewFactory(), + ) + if err != nil { + return otelcol.Factories{}, err + } + + factories.Processors, err = processor.MakeFactoryMap( + batchprocessor.NewFactory(), + ) + if err != nil { + return otelcol.Factories{}, err + } + factories.ProcessorModules = make(map[component.Type]string, len(factories.Processors)) + + factories.Connectors, err = connector.MakeFactoryMap() + if err != nil { + return otelcol.Factories{}, err + } + + return factories, nil +} diff --git a/test/mock/collector/nginx-agent.conf b/test/mock/collector/nginx-agent.conf index 0ed4119425..c24e7d208e 100644 --- a/test/mock/collector/nginx-agent.conf +++ b/test/mock/collector/nginx-agent.conf @@ -31,6 +31,8 @@ client: timeout: 10s collector: + log: + level: DEBUG receivers: host_metrics: collection_interval: 1m0s @@ -61,8 +63,14 @@ collector: - server: host: "otel-collector" port: 4317 + authenticator: headers_setter extensions: health: server: host: "127.0.0.1" port: 1337 + headers_setter: + headers: + - action: insert + key: "authorization" + value: "fake-authorization" diff --git a/test/mock/collector/otel-collector.yaml b/test/mock/collector/otel-collector.yaml index 815b38dad8..4473d1f4e1 100644 --- a/test/mock/collector/otel-collector.yaml +++ b/test/mock/collector/otel-collector.yaml @@ -3,21 +3,31 @@ receivers: protocols: grpc: endpoint: 0.0.0.0:4317 + auth: + authenticator: headers_check exporters: debug: verbosity: detailed prometheus: endpoint: "0.0.0.0:9775" + resource_to_telemetry_conversion: + enabled: true add_metric_suffixes: false processors: batch: +extensions: + headers_check: + service: + telemetry: + logs: + level: "debug" + output_paths: ["/mock-collector/collector.log"] + error_output_paths: ["/mock-collector/collector.log"] + extensions: [ headers_check ] pipelines: - traces: - receivers: [otlp] - exporters: [debug] metrics: receivers: [otlp] processors: [batch] diff --git a/test/types/config.go b/test/types/config.go index 71d79fa7c6..0f093d3410 100644 --- a/test/types/config.go +++ b/test/types/config.go @@ -55,9 +55,6 @@ func AgentConfig() *config.Config { Host: "127.0.0.1", Port: randomPort1, }, - Auth: &config.AuthConfig{ - Token: "super-secret-token", - }, }, }, }, @@ -70,7 +67,7 @@ func AgentConfig() *config.Config { }, Receivers: config.Receivers{ OtlpReceivers: OtlpReceivers(), - HostMetrics: config.HostMetrics{ + HostMetrics: &config.HostMetrics{ CollectionInterval: time.Minute, InitialDelay: time.Second, Scrapers: &config.HostMetricsScrapers{