diff --git a/GPU-Virtual-Service/README.md b/GPU-Virtual-Service/README.md index d299d01..3a814b9 100644 --- a/GPU-Virtual-Service/README.md +++ b/GPU-Virtual-Service/README.md @@ -114,15 +114,17 @@ kubectl apply -f volcano-development.yaml - containerd: ```Bash -ctr -n=k8s.io i import gpu_device_plugin.tar +ctr -n=k8s.io i import gpu_device_plugin.tar ctr -n=k8s.io i import cuda_client_update.tar +ctr -n=k8s.io i import xpu-exporter.tar ``` - docker: ```Bash -docker load -i gpu_device_plugin.tar +docker load -i gpu_device_plugin.tar docker load -i cuda_client_update.tar +docker load -i xpu-exporter.tar ``` 创建xpu命名空间 @@ -452,6 +454,18 @@ cd {filepath}/GPU-Virtual-Service/xpu-pool-service/GPU-device-plugin && go mod t 其中:{filepath} 应被替换为flexai本地代码的路径 编译生成文件:`gpu-device-plugin`、`xpu-client-tool`。 +#### xpu-exporter + +go的版本为1.22.1,建议保持一致: + +```Bash +export CGO_ENABLED=0 +cd {filepath}/GPU-Virtual-Service/xpu-pool-service/xpu-exporter && go mod tidy && go build -o xpu-exporter ./cmd/xpu-exporter +``` + +其中:{filepath} 应被替换为flexai本地代码的路径 +编译生成文件:`xpu-exporter`。 + #### 调度组件 调度组件的编译后文件可以在`lib/`文件夹中找到。 @@ -476,6 +490,7 @@ chmod +x {filepath}/GPU-Virtual-Service/xpu-pool-service/client_update/cuda-clie ```Bash cp -rf {filepath}/GPU-Virtual-Service/xpu-pool-service/GPU-device-plugin/gpu-device-plugin docker-build/gpu-device-plugin +cp -rf {filepath}/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/xpu-exporter docker-build/xpu-exporter ``` 通过以下链接下载os基础镜像,然后再部署 @@ -497,6 +512,12 @@ docker build -t cuda_client_update:2.0 . docker build -t gpu_device_plugin:2.0 . ``` +在`docker-build/xpu-exporter`目录下执行: + +```Bash +docker build -t xpu-exporter:2.0 . +``` + (上述代码的`.`不能忽略) 至此,镜像制作完成,可以使用如下命令将镜像保存到本地: @@ -504,6 +525,7 @@ docker build -t gpu_device_plugin:2.0 . ```Bash docker save -o gpu_device_plugin.tar gpu_device_plugin:2.0 docker save -o cuda_client_update.tar cuda_client_update:2.0 +docker save -o xpu-exporter.tar xpu-exporter:2.0 ``` volcano调度的打包流程与上述相仿,将编译产物复制到对应的`docker-build/`所在的文件夹下: diff --git a/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/collector/gpuservice/gpu_collector.go b/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/collector/gpuservice/gpu_collector.go index 2a0504f..dd37aed 100644 --- a/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/collector/gpuservice/gpu_collector.go +++ b/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/collector/gpuservice/gpu_collector.go @@ -197,13 +197,13 @@ func updateVgpuDeviceInfo(ch chan<- prometheus.Metric, gpu *utils.XPUDevice) { vgpuPodMap := make(map[string]int) for _, vgpu := range gpu.VxpuDeviceList { ch <- prometheus.MustNewConstMetric(xpuVgpuUtilizationDesc, prometheus.GaugeValue, - vgpu.VxpuCoreUtilization, []string{gpu.Id, gpu.NodeName, gpu.NodeIp, vgpu.PodUID, - vgpu.ContainerName, vgpu.Id, strconv.Itoa(int(vgpu.VxpuCoreLimit)), - strconv.Itoa(int(vgpu.VxpuMemoryLimit))}) + vgpu.VxpuCoreUtilization, gpu.Id, gpu.NodeName, gpu.NodeIp, vgpu.PodUID, + vgpu.ContainerName, vgpu.Id, strconv.Itoa(int(vgpu.VxpuCoreLimit)), + strconv.Itoa(int(vgpu.VxpuMemoryLimit))) ch <- prometheus.MustNewConstMetric(xpuVgpuMemoryUtilizationDesc, prometheus.GaugeValue, - vgpu.VxpuMemoryUtilization, []string{gpu.Id, gpu.NodeName, gpu.NodeIp, vgpu.PodUID, - vgpu.ContainerName, vgpu.Id, strconv.Itoa(int(vgpu.VxpuCoreLimit)), - strconv.Itoa(int(vgpu.VxpuMemoryLimit))}) + vgpu.VxpuMemoryUtilization, gpu.Id, gpu.NodeName, gpu.NodeIp, vgpu.PodUID, + vgpu.ContainerName, vgpu.Id, strconv.Itoa(int(vgpu.VxpuCoreLimit)), + strconv.Itoa(int(vgpu.VxpuMemoryLimit))) if _, ok := vgpuPodMap[vgpu.PodUID]; !ok { vgpuPodNumber += 1 vgpuPodMap[vgpu.PodUID] = vgpuPodNumber diff --git a/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/common/limiter/limit_handler.go b/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/common/limiter/limit_handler.go index 727ecfe..3218dad 100644 --- a/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/common/limiter/limit_handler.go +++ b/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/common/limiter/limit_handler.go @@ -9,13 +9,11 @@ import ( "context" "errors" "fmt" - "math" "net/http" "regexp" "strconv" "strings" "sync" - "syscall" "time" "huawei.com/xpu-exporter/common/cache" @@ -108,7 +106,7 @@ func (h *limitHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { req.Body = http.MaxBytesReader(w, req.Body, h.limitBytes) ctx := initContext(req) path := req.URL.Path - clientUserAgent := req.UserAgent() + _ = req.UserAgent() // avoid unused variable error clientIP := utils.ClientIP(req) // Check if the IP has exceeded the limit of 20 requests per minute diff --git a/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/common/service/api.pb.go b/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/common/service/api.pb.go index 85a04a9..18dc398 100644 --- a/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/common/service/api.pb.go +++ b/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/common/service/api.pb.go @@ -1,9 +1,11 @@ -// Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. + */ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v3.14.0 +// protoc v3.12.4 // source: api.proto package service @@ -16,7 +18,9 @@ import ( ) const ( + // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) @@ -45,7 +49,6 @@ func (*GetPidsRequest) ProtoMessage() {} func (x *GetPidsRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[0] - // check request if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -93,7 +96,6 @@ func (*GetPidsResponse) ProtoMessage() {} func (x *GetPidsResponse) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[1] - // check response if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -141,7 +143,6 @@ func (*GetAllVxpuInfoRequest) ProtoMessage() {} func (x *GetAllVxpuInfoRequest) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[2] - // check request if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -189,7 +190,6 @@ func (*GetAllVxpuInfoResponse) ProtoMessage() {} func (x *GetAllVxpuInfoResponse) ProtoReflect() protoreflect.Message { mi := &file_api_proto_msgTypes[3] - // check response if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -211,36 +211,34 @@ func (x *GetAllVxpuInfoResponse) GetVxpuInfos() string { } return "" } - + var File_api_proto protoreflect.FileDescriptor - + var file_api_proto_rawDesc = []byte{ 0x0a, 0x09, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x30, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x61, 0x74, 0x68, 0x22, 0x33, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x21, 0x0a, 0x0b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x69, 0x64, 0x73, 0x18, + 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x69, - 0x64, 0x73, 0x22, 0x32, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x78, 0x70, 0x75, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x50, + 0x64, 0x73, 0x22, 0x2f, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x78, 0x70, 0x75, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x78, 0x70, - 0x75, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, + 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x78, 0x70, + 0x75, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x78, 0x70, 0x75, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x56, 0x78, 0x70, 0x75, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x32, 0x8a, 0x01, 0x0a, 0x0b, - 0x50, 0x69, 0x64, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x0a, 0x47, - 0x65, 0x74, 0x50, 0x69, 0x64, 0x73, 0x12, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x64, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x78, 0x70, 0x75, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x78, - 0x70, 0x75, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x78, - 0x70, 0x75, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x42, 0x0c, 0x5a, 0x05, 0x2e, 0x2f, 0x3b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x09, 0x56, 0x78, 0x70, 0x75, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x32, 0x7e, 0x0a, 0x0b, 0x50, + 0x69, 0x64, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x50, 0x69, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x64, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x64, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x56, 0x78, 0x70, 0x75, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x56, 0x78, 0x70, 0x75, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x56, 0x78, 0x70, 0x75, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, + 0x2f, 0x3b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -257,22 +255,21 @@ func file_api_proto_rawDescGZIP() []byte { var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_api_proto_goTypes = []any{ - (*GetPidsRequest)(nil), // 0: GetPidsRequest - (*GetPidsResponse)(nil), // 1: GetPidsResponse - (*GetAllVxpuInfoRequest)(nil), // 2: GetAllVxpuInfoRequest + (*GetPidsRequest)(nil), // 0: GetPidsRequest + (*GetPidsResponse)(nil), // 1: GetPidsResponse + (*GetAllVxpuInfoRequest)(nil), // 2: GetAllVxpuInfoRequest (*GetAllVxpuInfoResponse)(nil), // 3: GetAllVxpuInfoResponse } - var file_api_proto_depIdxs = []int32{ - 0, - 2, - 1, - 3, - 2, - 0, - 0, - 0, - 0, + 0, // 0: PidsService.GetPids:input_type -> GetPidsRequest + 2, // 1: PidsService.GetAllVxpuInfo:input_type -> GetAllVxpuInfoRequest + 1, // 2: PidsService.GetPids:output_type -> GetPidsResponse + 3, // 3: PidsService.GetAllVxpuInfo:output_type -> GetAllVxpuInfoResponse + 2, // [2:4] is the sub-list for method output_type + 0, // [0:2] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name } func init() { file_api_proto_init() } @@ -282,49 +279,49 @@ func file_api_proto_init() { } if !protoimpl.UnsafeEnabled { file_api_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch val := v.(*GetPidsRequest); i { + switch v := v.(*GetPidsRequest); i { case 0: - return &val.state + return &v.state case 1: - return &val.sizeCache + return &v.sizeCache case 2: - return &val.unknownFields + return &v.unknownFields default: return nil } } file_api_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch val := v.(*GetPidsResponse); i { + switch v := v.(*GetPidsResponse); i { case 0: - return &val.state + return &v.state case 1: - return &val.sizeCache + return &v.sizeCache case 2: - return &val.unknownFields + return &v.unknownFields default: return nil } } file_api_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch val := v.(*GetAllVxpuInfoRequest); i { + switch v := v.(*GetAllVxpuInfoRequest); i { case 0: - return &val.state + return &v.state case 1: - return &val.sizeCache + return &v.sizeCache case 2: - return &val.unknownFields + return &v.unknownFields default: return nil } } file_api_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch val := v.(*GetAllVxpuInfoResponse); i { + switch v := v.(*GetAllVxpuInfoResponse); i { case 0: - return &val.state + return &v.state case 1: - return &val.sizeCache + return &v.sizeCache case 2: - return &val.unknownFields + return &v.unknownFields default: return nil } @@ -345,7 +342,7 @@ func file_api_proto_init() { MessageInfos: file_api_proto_msgTypes, }.Build() File_api_proto = out.File + file_api_proto_rawDesc = nil file_api_proto_goTypes = nil file_api_proto_depIdxs = nil - file_api_proto_rawDesc = nil -} \ No newline at end of file +} diff --git a/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/go.mod b/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/go.mod index 52722ed..ce49140 100644 --- a/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/go.mod +++ b/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/go.mod @@ -24,14 +24,14 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect - github.com/prometheus/client_model v0.3.0 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/sirupsen/logrus v1.8.2 // indirect + golang.org/x/net v0.26.0 // indirect golang.org/x/sys v0.21.0 // indirect golang.org/x/text v0.16.0 // indirect - golang.org/x/net v0.26.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/go.sum b/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/go.sum index 330086c..78bae1f 100644 --- a/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/go.sum +++ b/GPU-Virtual-Service/xpu-pool-service/xpu-exporter/go.sum @@ -1,42 +1,71 @@ -github.com/agiledragon/gomonkey/v2 v2.8.0 h1:u2KznN6vK8i9ppzk1z1CwA1I1EB9ptD+DtSxeCX5000= -github.com/agiledragon/gomonkey/v2 v2.8.0/go.mod h1:ap1AmDzcVOA21YpeJ3TCzIgstoaWLAgJbbgxfB4w21Y= -github.com/beorn7/perks v1.0.1 h1:VbKkNfF8BJzeqo4cOkq06Byr3wgKZxO82I6+h5OM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrWU2NbWtT9wwq4/hrbkbnv/1ERSQ0biHj6r1kpW= -github.com/cespare/xhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhbg7bL6oX9BBNnL2UFvs= -github.com/cespare/xhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6KWi7AoAEZDth3/j3BFtOZRXSLFGgrjcOS= -github.com/creack/pty v1.1.9/go.mod h1:oKZueFkSCkHThNRSMuK103XCEU+Q6VDX1nZUGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:j7Y8YCWNihsgmVo/mv3lAwL/sKON4iLHjSSi+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:j7Y8YCWNihsgmVo/mv3lAwL/sKON4iLHjSSi+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9gPS1ZP1WS5AWoXT9A3Wy9MM3WgvQSxFwengjduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YCWNihsgmVo/mv3lAwL/sKON4iLHjSSi+c5H38= -github.com/davecgh/go-spew v1.2.0-0.20180830191138-d8f796af33cc h1:U9gPS1ZP1WS5AWoXT9A3Wy9MM3WgvQSxFwengjduM= -github.com/davecgh/go-spew v1.2.0-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YCWNihsgmVo/mv3lAwL/sKON4iLHjSSi+c5H38= -github.com/golang/protobuf v1.3.5/go.mod h1:6QL7vtnYXwx2IrkT1hjjk0nAC1IDOTvTlVgJ1Rvqsdk= -github.com/golang/protobuf v1.5.4 h1:r3JL8qZpSEXOPTXNhkASYPm+s8sQ6aNdVaIdwek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnT1LA8WadRRCtIUKrTSv5nRhSEGB648F6GrS7xps= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZMsUsUo1bFLk1/XBfgEIGsA7atU8Am1Rl= -github.com/google/go-cmp v0.6.0/go.mod h1:17dULKBoK3o+DkrSSNjCkTxS6br92b3eImeNG1joY= -github.com/gopherjs/gopherjs v0.8.0-2018011719253-076667cb4d1/go.mod h1:wJFORRmlU1UXInCJ5qYoELFm8eSnnE06hX4iZ3EW= -github.com/gotools/gls v4.20.0+incompatible/go.mod h1:QJZT/ahp+ZTRa3Iow/JLffVYBrgL+9YlvahOwJU= -github.com/kramata/pretty v0.3.1 h1:F1RD4NNVAUPKphVc1HctHR4KEF365N8wSqdrN3LE= -github.com/kr/pretty v0.3.1/go.mod h1:h0EsHVhaxMs3cyo3Yncou5ZscifuDOLnwKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx9Ye2YvZYG36Q2turHI133Q95APcVaJ8Ps+Ay= -github.com/kr/text v0.2.0/go.mod h1:eler722TekiuGmk1dMXc/pM041kEraHUUmbW812grE= -github.com/mattiproud/golang-protobuf-extensions v1.0.4/go.mod h1:B5Xmu04STAnVFrANrmYjBb36TMTDstsZ7MSK+hVayKv4= -github.com/mattiproud/golang-protobuf-extensions v1.0.4 h1:BSXmu04STAnVFrANrmYjBb36TMTDstsZ7MSK+hVayKv4= -github.com/pmezard/go-diff-lib v1.0.0/go.mod h1:KH77k0fHyXK1pcRnkKqfTogsbg7ZNNVY45RDYZ/4= -github.com/pmezard/go-diff-lib v1.0.0 h1:Jamy5psRiCc7FGNV1IRMKT8wgtp5eCxdB1qhYGL6U= -github.com/pmezard/go-diff-lib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:JamY5psRiCc7FGNV1IRMKT8wgtp5eCxdB1qhYGL6U= -github.com/pmezard/go-diff-lib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKHT7k0fHyXK1pcRnkKqfTogsbg7ZNNVY45RDYZ/4= -github.com/prometheus/client_golang v1.16.0 h1:yk/h9hDbroGhVbc14BY+pRMfSuat626eFSHB7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:ZsuLrv/L90M4tJ781S1M891FEug1J9HzTqAX4Lkc= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/T9FD1B1ogZywDqEwp3fBMVqd1QXew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZI07rk3hygBe+caLn+Dr3dpGG85dvjTD7w9+w= -github.com/prometheus/common v0.42.0 h1:EksfXEY043pWMH5cg+KOUWeuJ5ov1I82GR8ee11YM= -github.com/prometheus/common v0.42.0/go.mod h1:x8wqVenjndUDjgODMputdOMw1oWf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.10.1 h1:KYk1Va/VMLutZCGazswOHko//tZV1FpXh+PywnziUAg= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8UTR/9bMRREkZFxAUcWzPHWJq+XBB/FM= -github.com/rogpeppe/go-internal v1.12.0 h1:exVl4IDcn6na9z1rAb56Vxr+cgYK3m30+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:FRYuTGaKd1oAfM02xzD0FnP3Pa99yedzYV+kq4uf4= -github.com/sirupsen/logrus v1.8.2 h1:Na+MAUL+c10P3CtS35FQYIVL6uKKDY7spTpCtHHII= -github.com/sirupsen/logrus v1.8.2/go.mod h1:naHLuLodP4jHN09R0sCBMtWGeJpr0b74mVsIT4qYEQ= \ No newline at end of file +github.com/agiledragon/gomonkey/v2 v2.8.0 h1:u2K2nNGyk0ippzklz1CWalllEB9ptD+DtSXeCX5O000= +github.com/agiledragon/gomonkey/v2 v2.8.0/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= +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/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +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/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +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/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +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/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +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/sirupsen/logrus v1.8.2 h1:Na+MAUL+cI0P3CtS35fqYIYVL6uKkDYY7sptpCtHHlI= +github.com/sirupsen/logrus v1.8.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/grpc v1.57.2 h1:uw37EN34aMFFXB2QPW7Tq6tdTbind1GpRxw5aOX3a5k= +google.golang.org/grpc v1.57.2/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +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/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=