From 84551b0285af543d2515f3d8a0f47e86683d4285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?And=C5=BEej=20Maciusovi=C4=8D?= Date: Fri, 17 Jan 2025 15:59:55 +0200 Subject: [PATCH] Container stats collections (#448) --- NOTICE.md | 2 +- README.md | 1 + api/v1/kube/kube_api.pb.go | 182 +- api/v1/kube/kube_api_grpc.pb.go | 48 +- api/v1/runtime/common.pb.go | 1543 +++++++++---- api/v1/runtime/common.proto | 65 +- api/v1/runtime/runtime_agent_api.pb.go | 1993 +++++++++++------ api/v1/runtime/runtime_agent_api.proto | 27 +- api/v1/runtime/runtime_agent_api_grpc.pb.go | 527 +++-- charts/kvisor/values-local.yaml | 4 +- cmd/agent/daemon/app/app.go | 14 +- cmd/agent/daemon/daemon.go | 10 +- cmd/agent/daemon/metrics/agent.go | 6 + ...s_exporter.go => castai_stats_exporter.go} | 26 +- .../daemon/state/container_stats_pipeline.go | 265 --- cmd/agent/daemon/state/controller.go | 55 +- cmd/agent/daemon/state/controller_test.go | 38 +- cmd/agent/daemon/state/exporter.go | 16 +- cmd/agent/daemon/state/stats_pipeline.go | 225 ++ .../state/castai_controller_test.go | 2 +- cmd/mock-server/main.go | 11 +- e2e/e2e.go | 96 +- go.mod | 8 +- go.sum | 9 - pkg/castai/client_test.go | 2 +- pkg/cgroup/cgroup.go | 96 +- pkg/cgroup/cgroup_cpu.go | 123 +- pkg/cgroup/cgroup_cpu_test.go | 44 - pkg/cgroup/cgroup_io.go | 215 +- pkg/cgroup/cgroup_io_test.go | 36 - pkg/cgroup/cgroup_linux.go | 41 - pkg/cgroup/cgroup_memory.go | 168 +- pkg/cgroup/cgroup_memory_test.go | 39 - pkg/cgroup/cgroup_pids.go | 76 + pkg/cgroup/client.go | 90 +- pkg/cgroup/client_test.go | 63 - pkg/cgroup/psi.go | 75 + pkg/cgroup/utils.go | 102 +- pkg/containers/client.go | 25 +- pkg/ebpftracer/tracer_decode_test.go | 2 - pkg/ebpftracer/tracer_filter_test.go | 3 +- pkg/ebpftracer/tracer_playground_test.go | 2 - pkg/proc/proc.go | 85 +- pkg/stats/stats.go | 56 - 44 files changed, 4151 insertions(+), 2365 deletions(-) rename cmd/agent/daemon/state/{castai_container_stats_exporter.go => castai_stats_exporter.go} (57%) delete mode 100644 cmd/agent/daemon/state/container_stats_pipeline.go create mode 100644 cmd/agent/daemon/state/stats_pipeline.go delete mode 100644 pkg/cgroup/cgroup_cpu_test.go delete mode 100644 pkg/cgroup/cgroup_io_test.go delete mode 100644 pkg/cgroup/cgroup_linux.go delete mode 100644 pkg/cgroup/cgroup_memory_test.go create mode 100644 pkg/cgroup/cgroup_pids.go create mode 100644 pkg/cgroup/psi.go delete mode 100644 pkg/stats/stats.go diff --git a/NOTICE.md b/NOTICE.md index ecbc43cb..5cdf5429 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -2,5 +2,5 @@ 1. ./cmd/imgcollector/image/artifact.go is adapted from https://github.com/aquasecurity/trivy (Apache 2 Licence) 2. ./pkg/ebpftracer parts are adapted from https://github.com/aquasecurity/tracee (Apache 2 Licence) -3. ./pkg/cgroup some parts are adapted from https://github.com/coroot/coroot-node-agent (Apache 2 Licence) +3. ./pkg/cgroup some parts for stats are adapted from https://github.com/opencontainers/runc/blob/main/libcontainer/cgroups/stats.go (Apache 2 Licence) 4. https://github.com/falcosecurity/libs/blob/74725244659e556ced587c2f0bec7bbd42d39b96/driver/bpf/fillers.h#L2395 is adapted to detect exec upper layer (Apache 2 Licence) diff --git a/README.md b/README.md index 8900f0a2..1ba8c2d9 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,4 @@ The helm chart for the CAST AI Kvisor is published in the [castai/helm-charts](h ## Licence [Apache 2.0 License](LICENSE) See [NOTICE.md](NOTICE.md) for complete details, including software and third-party licenses and permissions. + diff --git a/api/v1/kube/kube_api.pb.go b/api/v1/kube/kube_api.pb.go index 0a6d7c3c..97e14b26 100644 --- a/api/v1/kube/kube_api.pb.go +++ b/api/v1/kube/kube_api.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.2 -// protoc v5.29.0 +// protoc-gen-go v1.34.2 +// protoc v3.19.4 // source: api/v1/kube/kube_api.proto package v1 @@ -28,9 +28,11 @@ type GetClusterInfoRequest struct { func (x *GetClusterInfoRequest) Reset() { *x = GetClusterInfoRequest{} - mi := &file_api_v1_kube_kube_api_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_kube_kube_api_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetClusterInfoRequest) String() string { @@ -41,7 +43,7 @@ func (*GetClusterInfoRequest) ProtoMessage() {} func (x *GetClusterInfoRequest) ProtoReflect() protoreflect.Message { mi := &file_api_v1_kube_kube_api_proto_msgTypes[0] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -67,9 +69,11 @@ type GetClusterInfoResponse struct { func (x *GetClusterInfoResponse) Reset() { *x = GetClusterInfoResponse{} - mi := &file_api_v1_kube_kube_api_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_kube_kube_api_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetClusterInfoResponse) String() string { @@ -80,7 +84,7 @@ func (*GetClusterInfoResponse) ProtoMessage() {} func (x *GetClusterInfoResponse) ProtoReflect() protoreflect.Message { mi := &file_api_v1_kube_kube_api_proto_msgTypes[1] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -119,9 +123,11 @@ type GetIPInfoRequest struct { func (x *GetIPInfoRequest) Reset() { *x = GetIPInfoRequest{} - mi := &file_api_v1_kube_kube_api_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_kube_kube_api_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetIPInfoRequest) String() string { @@ -132,7 +138,7 @@ func (*GetIPInfoRequest) ProtoMessage() {} func (x *GetIPInfoRequest) ProtoReflect() protoreflect.Message { mi := &file_api_v1_kube_kube_api_proto_msgTypes[2] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -164,9 +170,11 @@ type GetIPInfoResponse struct { func (x *GetIPInfoResponse) Reset() { *x = GetIPInfoResponse{} - mi := &file_api_v1_kube_kube_api_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_kube_kube_api_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetIPInfoResponse) String() string { @@ -177,7 +185,7 @@ func (*GetIPInfoResponse) ProtoMessage() {} func (x *GetIPInfoResponse) ProtoReflect() protoreflect.Message { mi := &file_api_v1_kube_kube_api_proto_msgTypes[3] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -216,9 +224,11 @@ type IPInfo struct { func (x *IPInfo) Reset() { *x = IPInfo{} - mi := &file_api_v1_kube_kube_api_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_kube_kube_api_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *IPInfo) String() string { @@ -229,7 +239,7 @@ func (*IPInfo) ProtoMessage() {} func (x *IPInfo) ProtoReflect() protoreflect.Message { mi := &file_api_v1_kube_kube_api_proto_msgTypes[4] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -310,9 +320,11 @@ type GetPodRequest struct { func (x *GetPodRequest) Reset() { *x = GetPodRequest{} - mi := &file_api_v1_kube_kube_api_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_kube_kube_api_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetPodRequest) String() string { @@ -323,7 +335,7 @@ func (*GetPodRequest) ProtoMessage() {} func (x *GetPodRequest) ProtoReflect() protoreflect.Message { mi := &file_api_v1_kube_kube_api_proto_msgTypes[5] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -355,9 +367,11 @@ type GetPodResponse struct { func (x *GetPodResponse) Reset() { *x = GetPodResponse{} - mi := &file_api_v1_kube_kube_api_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_kube_kube_api_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetPodResponse) String() string { @@ -368,7 +382,7 @@ func (*GetPodResponse) ProtoMessage() {} func (x *GetPodResponse) ProtoReflect() protoreflect.Message { mi := &file_api_v1_kube_kube_api_proto_msgTypes[6] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -404,9 +418,11 @@ type Pod struct { func (x *Pod) Reset() { *x = Pod{} - mi := &file_api_v1_kube_kube_api_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_kube_kube_api_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Pod) String() string { @@ -417,7 +433,7 @@ func (*Pod) ProtoMessage() {} func (x *Pod) ProtoReflect() protoreflect.Message { mi := &file_api_v1_kube_kube_api_proto_msgTypes[7] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -580,6 +596,104 @@ func file_api_v1_kube_kube_api_proto_init() { if File_api_v1_kube_kube_api_proto != nil { return } + if !protoimpl.UnsafeEnabled { + file_api_v1_kube_kube_api_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*GetClusterInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_kube_kube_api_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*GetClusterInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_kube_kube_api_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*GetIPInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_kube_kube_api_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*GetIPInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_kube_kube_api_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*IPInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_kube_kube_api_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*GetPodRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_kube_kube_api_proto_msgTypes[6].Exporter = func(v any, i int) any { + switch v := v.(*GetPodResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_kube_kube_api_proto_msgTypes[7].Exporter = func(v any, i int) any { + switch v := v.(*Pod); 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/v1/kube/kube_api_grpc.pb.go b/api/v1/kube/kube_api_grpc.pb.go index 837a2400..74b9f3b7 100644 --- a/api/v1/kube/kube_api_grpc.pb.go +++ b/api/v1/kube/kube_api_grpc.pb.go @@ -1,8 +1,4 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.0 -// source: api/v1/kube/kube_api.proto package v1 @@ -15,14 +11,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.64.0 or later. -const _ = grpc.SupportPackageIsVersion9 - -const ( - KubeAPI_GetClusterInfo_FullMethodName = "/kube.v1.KubeAPI/GetClusterInfo" - KubeAPI_GetIPInfo_FullMethodName = "/kube.v1.KubeAPI/GetIPInfo" - KubeAPI_GetPod_FullMethodName = "/kube.v1.KubeAPI/GetPod" -) +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 // KubeAPIClient is the client API for KubeAPI service. // @@ -42,9 +32,8 @@ func NewKubeAPIClient(cc grpc.ClientConnInterface) KubeAPIClient { } func (c *kubeAPIClient) GetClusterInfo(ctx context.Context, in *GetClusterInfoRequest, opts ...grpc.CallOption) (*GetClusterInfoResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetClusterInfoResponse) - err := c.cc.Invoke(ctx, KubeAPI_GetClusterInfo_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, "/kube.v1.KubeAPI/GetClusterInfo", in, out, opts...) if err != nil { return nil, err } @@ -52,9 +41,8 @@ func (c *kubeAPIClient) GetClusterInfo(ctx context.Context, in *GetClusterInfoRe } func (c *kubeAPIClient) GetIPInfo(ctx context.Context, in *GetIPInfoRequest, opts ...grpc.CallOption) (*GetIPInfoResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetIPInfoResponse) - err := c.cc.Invoke(ctx, KubeAPI_GetIPInfo_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, "/kube.v1.KubeAPI/GetIPInfo", in, out, opts...) if err != nil { return nil, err } @@ -62,9 +50,8 @@ func (c *kubeAPIClient) GetIPInfo(ctx context.Context, in *GetIPInfoRequest, opt } func (c *kubeAPIClient) GetPod(ctx context.Context, in *GetPodRequest, opts ...grpc.CallOption) (*GetPodResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetPodResponse) - err := c.cc.Invoke(ctx, KubeAPI_GetPod_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, "/kube.v1.KubeAPI/GetPod", in, out, opts...) if err != nil { return nil, err } @@ -73,19 +60,16 @@ func (c *kubeAPIClient) GetPod(ctx context.Context, in *GetPodRequest, opts ...g // KubeAPIServer is the server API for KubeAPI service. // All implementations should embed UnimplementedKubeAPIServer -// for forward compatibility. +// for forward compatibility type KubeAPIServer interface { GetClusterInfo(context.Context, *GetClusterInfoRequest) (*GetClusterInfoResponse, error) GetIPInfo(context.Context, *GetIPInfoRequest) (*GetIPInfoResponse, error) GetPod(context.Context, *GetPodRequest) (*GetPodResponse, error) } -// UnimplementedKubeAPIServer should be embedded to have -// forward compatible implementations. -// -// NOTE: this should be embedded by value instead of pointer to avoid a nil -// pointer dereference when methods are called. -type UnimplementedKubeAPIServer struct{} +// UnimplementedKubeAPIServer should be embedded to have forward compatible implementations. +type UnimplementedKubeAPIServer struct { +} func (UnimplementedKubeAPIServer) GetClusterInfo(context.Context, *GetClusterInfoRequest) (*GetClusterInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetClusterInfo not implemented") @@ -96,7 +80,6 @@ func (UnimplementedKubeAPIServer) GetIPInfo(context.Context, *GetIPInfoRequest) func (UnimplementedKubeAPIServer) GetPod(context.Context, *GetPodRequest) (*GetPodResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetPod not implemented") } -func (UnimplementedKubeAPIServer) testEmbeddedByValue() {} // UnsafeKubeAPIServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to KubeAPIServer will @@ -106,13 +89,6 @@ type UnsafeKubeAPIServer interface { } func RegisterKubeAPIServer(s grpc.ServiceRegistrar, srv KubeAPIServer) { - // If the following call pancis, it indicates UnimplementedKubeAPIServer was - // embedded by pointer and is nil. This will cause panics if an - // unimplemented method is ever invoked, so we test this at initialization - // time to prevent it from happening at runtime later due to I/O. - if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { - t.testEmbeddedByValue() - } s.RegisterService(&KubeAPI_ServiceDesc, srv) } @@ -126,7 +102,7 @@ func _KubeAPI_GetClusterInfo_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: KubeAPI_GetClusterInfo_FullMethodName, + FullMethod: "/kube.v1.KubeAPI/GetClusterInfo", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(KubeAPIServer).GetClusterInfo(ctx, req.(*GetClusterInfoRequest)) @@ -144,7 +120,7 @@ func _KubeAPI_GetIPInfo_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: KubeAPI_GetIPInfo_FullMethodName, + FullMethod: "/kube.v1.KubeAPI/GetIPInfo", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(KubeAPIServer).GetIPInfo(ctx, req.(*GetIPInfoRequest)) @@ -162,7 +138,7 @@ func _KubeAPI_GetPod_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: KubeAPI_GetPod_FullMethodName, + FullMethod: "/kube.v1.KubeAPI/GetPod", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(KubeAPIServer).GetPod(ctx, req.(*GetPodRequest)) diff --git a/api/v1/runtime/common.pb.go b/api/v1/runtime/common.pb.go index 12711b43..ad7f38db 100644 --- a/api/v1/runtime/common.pb.go +++ b/api/v1/runtime/common.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.2 -// protoc v5.29.0 +// protoc-gen-go v1.34.2 +// protoc v3.19.4 // source: api/v1/runtime/common.proto package v1 @@ -69,64 +69,6 @@ func (FlowDirection) EnumDescriptor() ([]byte, []int) { return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{0} } -type StatsGroup int32 - -const ( - StatsGroup_STATS_GROUP_UNKNOWN StatsGroup = 0 - StatsGroup_STATS_GROUP_SYSCALL StatsGroup = 1 - StatsGroup_STATS_GROUP_CPU StatsGroup = 2 - StatsGroup_STATS_GROUP_MEMORY StatsGroup = 3 - StatsGroup_STATS_GROUP_IO StatsGroup = 4 - StatsGroup_STATS_GROUP_NET StatsGroup = 5 -) - -// Enum value maps for StatsGroup. -var ( - StatsGroup_name = map[int32]string{ - 0: "STATS_GROUP_UNKNOWN", - 1: "STATS_GROUP_SYSCALL", - 2: "STATS_GROUP_CPU", - 3: "STATS_GROUP_MEMORY", - 4: "STATS_GROUP_IO", - 5: "STATS_GROUP_NET", - } - StatsGroup_value = map[string]int32{ - "STATS_GROUP_UNKNOWN": 0, - "STATS_GROUP_SYSCALL": 1, - "STATS_GROUP_CPU": 2, - "STATS_GROUP_MEMORY": 3, - "STATS_GROUP_IO": 4, - "STATS_GROUP_NET": 5, - } -) - -func (x StatsGroup) Enum() *StatsGroup { - p := new(StatsGroup) - *p = x - return p -} - -func (x StatsGroup) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (StatsGroup) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_runtime_common_proto_enumTypes[1].Descriptor() -} - -func (StatsGroup) Type() protoreflect.EnumType { - return &file_api_v1_runtime_common_proto_enumTypes[1] -} - -func (x StatsGroup) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use StatsGroup.Descriptor instead. -func (StatsGroup) EnumDescriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{1} -} - type SignatureEventID int32 const ( @@ -163,11 +105,11 @@ func (x SignatureEventID) String() string { } func (SignatureEventID) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_runtime_common_proto_enumTypes[2].Descriptor() + return file_api_v1_runtime_common_proto_enumTypes[1].Descriptor() } func (SignatureEventID) Type() protoreflect.EnumType { - return &file_api_v1_runtime_common_proto_enumTypes[2] + return &file_api_v1_runtime_common_proto_enumTypes[1] } func (x SignatureEventID) Number() protoreflect.EnumNumber { @@ -176,7 +118,7 @@ func (x SignatureEventID) Number() protoreflect.EnumNumber { // Deprecated: Use SignatureEventID.Descriptor instead. func (SignatureEventID) EnumDescriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{2} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{1} } type SOCKS5Role int32 @@ -212,11 +154,11 @@ func (x SOCKS5Role) String() string { } func (SOCKS5Role) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_runtime_common_proto_enumTypes[3].Descriptor() + return file_api_v1_runtime_common_proto_enumTypes[2].Descriptor() } func (SOCKS5Role) Type() protoreflect.EnumType { - return &file_api_v1_runtime_common_proto_enumTypes[3] + return &file_api_v1_runtime_common_proto_enumTypes[2] } func (x SOCKS5Role) Number() protoreflect.EnumNumber { @@ -225,7 +167,7 @@ func (x SOCKS5Role) Number() protoreflect.EnumNumber { // Deprecated: Use SOCKS5Role.Descriptor instead. func (SOCKS5Role) EnumDescriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{3} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{2} } type SOCKS5AddressType int32 @@ -264,11 +206,11 @@ func (x SOCKS5AddressType) String() string { } func (SOCKS5AddressType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_runtime_common_proto_enumTypes[4].Descriptor() + return file_api_v1_runtime_common_proto_enumTypes[3].Descriptor() } func (SOCKS5AddressType) Type() protoreflect.EnumType { - return &file_api_v1_runtime_common_proto_enumTypes[4] + return &file_api_v1_runtime_common_proto_enumTypes[3] } func (x SOCKS5AddressType) Number() protoreflect.EnumNumber { @@ -277,7 +219,7 @@ func (x SOCKS5AddressType) Number() protoreflect.EnumNumber { // Deprecated: Use SOCKS5AddressType.Descriptor instead. func (SOCKS5AddressType) EnumDescriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{4} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{3} } type NetflowProtocol int32 @@ -313,11 +255,11 @@ func (x NetflowProtocol) String() string { } func (NetflowProtocol) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_runtime_common_proto_enumTypes[5].Descriptor() + return file_api_v1_runtime_common_proto_enumTypes[4].Descriptor() } func (NetflowProtocol) Type() protoreflect.EnumType { - return &file_api_v1_runtime_common_proto_enumTypes[5] + return &file_api_v1_runtime_common_proto_enumTypes[4] } func (x NetflowProtocol) Number() protoreflect.EnumNumber { @@ -326,7 +268,7 @@ func (x NetflowProtocol) Number() protoreflect.EnumNumber { // Deprecated: Use NetflowProtocol.Descriptor instead. func (NetflowProtocol) EnumDescriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{5} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{4} } type Any struct { @@ -341,9 +283,11 @@ type Any struct { func (x *Any) Reset() { *x = Any{} - mi := &file_api_v1_runtime_common_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Any) String() string { @@ -354,7 +298,7 @@ func (*Any) ProtoMessage() {} func (x *Any) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_common_proto_msgTypes[0] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -403,9 +347,11 @@ type Exec struct { func (x *Exec) Reset() { *x = Exec{} - mi := &file_api_v1_runtime_common_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Exec) String() string { @@ -416,7 +362,7 @@ func (*Exec) ProtoMessage() {} func (x *Exec) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_common_proto_msgTypes[1] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -469,9 +415,11 @@ type File struct { func (x *File) Reset() { *x = File{} - mi := &file_api_v1_runtime_common_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *File) String() string { @@ -482,7 +430,7 @@ func (*File) ProtoMessage() {} func (x *File) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_common_proto_msgTypes[2] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -518,9 +466,11 @@ type Tuple struct { func (x *Tuple) Reset() { *x = Tuple{} - mi := &file_api_v1_runtime_common_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Tuple) String() string { @@ -531,7 +481,7 @@ func (*Tuple) ProtoMessage() {} func (x *Tuple) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_common_proto_msgTypes[3] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -594,9 +544,11 @@ type DNS struct { func (x *DNS) Reset() { *x = DNS{} - mi := &file_api_v1_runtime_common_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *DNS) String() string { @@ -607,7 +559,7 @@ func (*DNS) ProtoMessage() {} func (x *DNS) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_common_proto_msgTypes[4] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -665,9 +617,11 @@ type DNSAnswers struct { func (x *DNSAnswers) Reset() { *x = DNSAnswers{} - mi := &file_api_v1_runtime_common_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *DNSAnswers) String() string { @@ -678,7 +632,7 @@ func (*DNSAnswers) ProtoMessage() {} func (x *DNSAnswers) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_common_proto_msgTypes[5] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -735,67 +689,6 @@ func (x *DNSAnswers) GetCname() string { return "" } -type Stats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Group StatsGroup `protobuf:"varint,1,opt,name=group,proto3,enum=runtime.v1.StatsGroup" json:"group,omitempty"` - Subgroup uint32 `protobuf:"varint,2,opt,name=subgroup,proto3" json:"subgroup,omitempty"` - Value float64 `protobuf:"fixed64,3,opt,name=value,proto3" json:"value,omitempty"` -} - -func (x *Stats) Reset() { - *x = Stats{} - mi := &file_api_v1_runtime_common_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Stats) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Stats) ProtoMessage() {} - -func (x *Stats) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[6] - 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 Stats.ProtoReflect.Descriptor instead. -func (*Stats) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{6} -} - -func (x *Stats) GetGroup() StatsGroup { - if x != nil { - return x.Group - } - return StatsGroup_STATS_GROUP_UNKNOWN -} - -func (x *Stats) GetSubgroup() uint32 { - if x != nil { - return x.Subgroup - } - return 0 -} - -func (x *Stats) GetValue() float64 { - if x != nil { - return x.Value - } - return 0 -} - type LogEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -807,9 +700,11 @@ type LogEvent struct { func (x *LogEvent) Reset() { *x = LogEvent{} - mi := &file_api_v1_runtime_common_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *LogEvent) String() string { @@ -819,8 +714,8 @@ func (x *LogEvent) String() string { func (*LogEvent) ProtoMessage() {} func (x *LogEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[7] - if x != nil { + mi := &file_api_v1_runtime_common_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -832,7 +727,7 @@ func (x *LogEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use LogEvent.ProtoReflect.Descriptor instead. func (*LogEvent) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{7} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{6} } func (x *LogEvent) GetLevel() int32 { @@ -860,9 +755,11 @@ type SignatureEvent struct { func (x *SignatureEvent) Reset() { *x = SignatureEvent{} - mi := &file_api_v1_runtime_common_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *SignatureEvent) String() string { @@ -872,8 +769,8 @@ func (x *SignatureEvent) String() string { func (*SignatureEvent) ProtoMessage() {} func (x *SignatureEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[8] - if x != nil { + mi := &file_api_v1_runtime_common_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -885,7 +782,7 @@ func (x *SignatureEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SignatureEvent.ProtoReflect.Descriptor instead. func (*SignatureEvent) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{8} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{7} } func (x *SignatureEvent) GetMetadata() *SignatureMetadata { @@ -913,9 +810,11 @@ type SignatureMetadata struct { func (x *SignatureMetadata) Reset() { *x = SignatureMetadata{} - mi := &file_api_v1_runtime_common_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *SignatureMetadata) String() string { @@ -925,8 +824,8 @@ func (x *SignatureMetadata) String() string { func (*SignatureMetadata) ProtoMessage() {} func (x *SignatureMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[9] - if x != nil { + mi := &file_api_v1_runtime_common_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -938,7 +837,7 @@ func (x *SignatureMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use SignatureMetadata.ProtoReflect.Descriptor instead. func (*SignatureMetadata) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{9} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{8} } func (x *SignatureMetadata) GetId() SignatureEventID { @@ -970,9 +869,11 @@ type SignatureFinding struct { func (x *SignatureFinding) Reset() { *x = SignatureFinding{} - mi := &file_api_v1_runtime_common_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *SignatureFinding) String() string { @@ -982,8 +883,8 @@ func (x *SignatureFinding) String() string { func (*SignatureFinding) ProtoMessage() {} func (x *SignatureFinding) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[10] - if x != nil { + mi := &file_api_v1_runtime_common_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -995,7 +896,7 @@ func (x *SignatureFinding) ProtoReflect() protoreflect.Message { // Deprecated: Use SignatureFinding.ProtoReflect.Descriptor instead. func (*SignatureFinding) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{10} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{9} } func (m *SignatureFinding) GetData() isSignatureFinding_Data { @@ -1060,9 +961,11 @@ type StdioViaSocketFinding struct { func (x *StdioViaSocketFinding) Reset() { *x = StdioViaSocketFinding{} - mi := &file_api_v1_runtime_common_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *StdioViaSocketFinding) String() string { @@ -1072,8 +975,8 @@ func (x *StdioViaSocketFinding) String() string { func (*StdioViaSocketFinding) ProtoMessage() {} func (x *StdioViaSocketFinding) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[11] - if x != nil { + mi := &file_api_v1_runtime_common_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1085,7 +988,7 @@ func (x *StdioViaSocketFinding) ProtoReflect() protoreflect.Message { // Deprecated: Use StdioViaSocketFinding.ProtoReflect.Descriptor instead. func (*StdioViaSocketFinding) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{11} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{10} } func (x *StdioViaSocketFinding) GetIp() []byte { @@ -1119,9 +1022,11 @@ type TtyDetectedFinding struct { func (x *TtyDetectedFinding) Reset() { *x = TtyDetectedFinding{} - mi := &file_api_v1_runtime_common_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *TtyDetectedFinding) String() string { @@ -1131,8 +1036,8 @@ func (x *TtyDetectedFinding) String() string { func (*TtyDetectedFinding) ProtoMessage() {} func (x *TtyDetectedFinding) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[12] - if x != nil { + mi := &file_api_v1_runtime_common_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1144,7 +1049,7 @@ func (x *TtyDetectedFinding) ProtoReflect() protoreflect.Message { // Deprecated: Use TtyDetectedFinding.ProtoReflect.Descriptor instead. func (*TtyDetectedFinding) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{12} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{11} } func (x *TtyDetectedFinding) GetPath() string { @@ -1169,9 +1074,11 @@ type SOCKS5DetectedFinding struct { func (x *SOCKS5DetectedFinding) Reset() { *x = SOCKS5DetectedFinding{} - mi := &file_api_v1_runtime_common_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *SOCKS5DetectedFinding) String() string { @@ -1181,8 +1088,8 @@ func (x *SOCKS5DetectedFinding) String() string { func (*SOCKS5DetectedFinding) ProtoMessage() {} func (x *SOCKS5DetectedFinding) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[13] - if x != nil { + mi := &file_api_v1_runtime_common_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1194,7 +1101,7 @@ func (x *SOCKS5DetectedFinding) ProtoReflect() protoreflect.Message { // Deprecated: Use SOCKS5DetectedFinding.ProtoReflect.Descriptor instead. func (*SOCKS5DetectedFinding) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{13} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{12} } func (x *SOCKS5DetectedFinding) GetRole() SOCKS5Role { @@ -1252,9 +1159,11 @@ type SSHData struct { func (x *SSHData) Reset() { *x = SSHData{} - mi := &file_api_v1_runtime_common_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *SSHData) String() string { @@ -1264,8 +1173,8 @@ func (x *SSHData) String() string { func (*SSHData) ProtoMessage() {} func (x *SSHData) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[14] - if x != nil { + mi := &file_api_v1_runtime_common_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1277,7 +1186,7 @@ func (x *SSHData) ProtoReflect() protoreflect.Message { // Deprecated: Use SSHData.ProtoReflect.Descriptor instead. func (*SSHData) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{14} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{13} } func (x *SSHData) GetFlowDirection() FlowDirection { @@ -1330,9 +1239,11 @@ type Netflow struct { func (x *Netflow) Reset() { *x = Netflow{} - mi := &file_api_v1_runtime_common_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Netflow) String() string { @@ -1342,8 +1253,8 @@ func (x *Netflow) String() string { func (*Netflow) ProtoMessage() {} func (x *Netflow) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[15] - if x != nil { + mi := &file_api_v1_runtime_common_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1355,7 +1266,7 @@ func (x *Netflow) ProtoReflect() protoreflect.Message { // Deprecated: Use Netflow.ProtoReflect.Descriptor instead. func (*Netflow) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{15} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{14} } func (x *Netflow) GetTimestamp() uint64 { @@ -1471,9 +1382,11 @@ type NetflowDestination struct { func (x *NetflowDestination) Reset() { *x = NetflowDestination{} - mi := &file_api_v1_runtime_common_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *NetflowDestination) String() string { @@ -1483,8 +1396,8 @@ func (x *NetflowDestination) String() string { func (*NetflowDestination) ProtoMessage() {} func (x *NetflowDestination) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_common_proto_msgTypes[16] - if x != nil { + mi := &file_api_v1_runtime_common_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1496,7 +1409,7 @@ func (x *NetflowDestination) ProtoReflect() protoreflect.Message { // Deprecated: Use NetflowDestination.ProtoReflect.Descriptor instead. func (*NetflowDestination) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{16} + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{15} } func (x *NetflowDestination) GetNamespace() string { @@ -1590,6 +1503,433 @@ func (x *NetflowDestination) GetRxPackets() uint64 { return 0 } +type PSIData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Total uint64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *PSIData) Reset() { + *x = PSIData{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PSIData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PSIData) ProtoMessage() {} + +func (x *PSIData) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_runtime_common_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PSIData.ProtoReflect.Descriptor instead. +func (*PSIData) Descriptor() ([]byte, []int) { + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{16} +} + +func (x *PSIData) GetTotal() uint64 { + if x != nil { + return x.Total + } + return 0 +} + +type PSIStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Some *PSIData `protobuf:"bytes,1,opt,name=some,proto3" json:"some,omitempty"` + Full *PSIData `protobuf:"bytes,2,opt,name=full,proto3" json:"full,omitempty"` +} + +func (x *PSIStats) Reset() { + *x = PSIStats{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PSIStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PSIStats) ProtoMessage() {} + +func (x *PSIStats) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_runtime_common_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PSIStats.ProtoReflect.Descriptor instead. +func (*PSIStats) Descriptor() ([]byte, []int) { + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{17} +} + +func (x *PSIStats) GetSome() *PSIData { + if x != nil { + return x.Some + } + return nil +} + +func (x *PSIStats) GetFull() *PSIData { + if x != nil { + return x.Full + } + return nil +} + +type CpuStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Total CPU time consumed. + // Units: nanoseconds. + TotalUsage uint64 `protobuf:"varint,1,opt,name=total_usage,json=totalUsage,proto3" json:"total_usage,omitempty"` + // Time spent by tasks of the cgroup in kernel mode. + // Units: nanoseconds. + UsageInKernelmode uint64 `protobuf:"varint,2,opt,name=usage_in_kernelmode,json=usageInKernelmode,proto3" json:"usage_in_kernelmode,omitempty"` + // Time spent by tasks of the cgroup in user mode. + // Units: nanoseconds. + UsageInUsermode uint64 `protobuf:"varint,3,opt,name=usage_in_usermode,json=usageInUsermode,proto3" json:"usage_in_usermode,omitempty"` + // Number of periods when the container hit its throttling limit. + ThrottledPeriods uint64 `protobuf:"varint,4,opt,name=throttled_periods,json=throttledPeriods,proto3" json:"throttled_periods,omitempty"` + // Aggregate time the container was throttled for in nanoseconds. + ThrottledTime uint64 `protobuf:"varint,5,opt,name=throttled_time,json=throttledTime,proto3" json:"throttled_time,omitempty"` + Psi *PSIStats `protobuf:"bytes,6,opt,name=psi,proto3" json:"psi,omitempty"` +} + +func (x *CpuStats) Reset() { + *x = CpuStats{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CpuStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CpuStats) ProtoMessage() {} + +func (x *CpuStats) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_runtime_common_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CpuStats.ProtoReflect.Descriptor instead. +func (*CpuStats) Descriptor() ([]byte, []int) { + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{18} +} + +func (x *CpuStats) GetTotalUsage() uint64 { + if x != nil { + return x.TotalUsage + } + return 0 +} + +func (x *CpuStats) GetUsageInKernelmode() uint64 { + if x != nil { + return x.UsageInKernelmode + } + return 0 +} + +func (x *CpuStats) GetUsageInUsermode() uint64 { + if x != nil { + return x.UsageInUsermode + } + return 0 +} + +func (x *CpuStats) GetThrottledPeriods() uint64 { + if x != nil { + return x.ThrottledPeriods + } + return 0 +} + +func (x *CpuStats) GetThrottledTime() uint64 { + if x != nil { + return x.ThrottledTime + } + return 0 +} + +func (x *CpuStats) GetPsi() *PSIStats { + if x != nil { + return x.Psi + } + return nil +} + +type MemoryData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Usage uint64 `protobuf:"varint,1,opt,name=usage,proto3" json:"usage,omitempty"` + Limit uint64 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` +} + +func (x *MemoryData) Reset() { + *x = MemoryData{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemoryData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemoryData) ProtoMessage() {} + +func (x *MemoryData) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_runtime_common_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemoryData.ProtoReflect.Descriptor instead. +func (*MemoryData) Descriptor() ([]byte, []int) { + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{19} +} + +func (x *MemoryData) GetUsage() uint64 { + if x != nil { + return x.Usage + } + return 0 +} + +func (x *MemoryData) GetLimit() uint64 { + if x != nil { + return x.Limit + } + return 0 +} + +type MemoryStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cache uint64 `protobuf:"varint,1,opt,name=cache,proto3" json:"cache,omitempty"` + Usage *MemoryData `protobuf:"bytes,2,opt,name=usage,proto3" json:"usage,omitempty"` + SwapOnlyUsage *MemoryData `protobuf:"bytes,4,opt,name=swap_only_usage,json=swapOnlyUsage,proto3" json:"swap_only_usage,omitempty"` + Psi *PSIStats `protobuf:"bytes,8,opt,name=psi,proto3" json:"psi,omitempty"` +} + +func (x *MemoryStats) Reset() { + *x = MemoryStats{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemoryStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemoryStats) ProtoMessage() {} + +func (x *MemoryStats) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_runtime_common_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemoryStats.ProtoReflect.Descriptor instead. +func (*MemoryStats) Descriptor() ([]byte, []int) { + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{20} +} + +func (x *MemoryStats) GetCache() uint64 { + if x != nil { + return x.Cache + } + return 0 +} + +func (x *MemoryStats) GetUsage() *MemoryData { + if x != nil { + return x.Usage + } + return nil +} + +func (x *MemoryStats) GetSwapOnlyUsage() *MemoryData { + if x != nil { + return x.SwapOnlyUsage + } + return nil +} + +func (x *MemoryStats) GetPsi() *PSIStats { + if x != nil { + return x.Psi + } + return nil +} + +type PidsStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // number of pids in the cgroup + Current uint64 `protobuf:"varint,1,opt,name=current,proto3" json:"current,omitempty"` + // active pids hard limit + Limit uint64 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` +} + +func (x *PidsStats) Reset() { + *x = PidsStats{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PidsStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PidsStats) ProtoMessage() {} + +func (x *PidsStats) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_runtime_common_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PidsStats.ProtoReflect.Descriptor instead. +func (*PidsStats) Descriptor() ([]byte, []int) { + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{21} +} + +func (x *PidsStats) GetCurrent() uint64 { + if x != nil { + return x.Current + } + return 0 +} + +func (x *PidsStats) GetLimit() uint64 { + if x != nil { + return x.Limit + } + return 0 +} + +type IOStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Psi *PSIStats `protobuf:"bytes,1,opt,name=psi,proto3" json:"psi,omitempty"` +} + +func (x *IOStats) Reset() { + *x = IOStats{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_common_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IOStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IOStats) ProtoMessage() {} + +func (x *IOStats) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_runtime_common_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IOStats.ProtoReflect.Descriptor instead. +func (*IOStats) Descriptor() ([]byte, []int) { + return file_api_v1_runtime_common_proto_rawDescGZIP(), []int{22} +} + +func (x *IOStats) GetPsi() *PSIStats { + if x != nil { + return x.Psi + } + return nil +} + var File_api_v1_runtime_common_proto protoreflect.FileDescriptor var file_api_v1_runtime_common_proto_rawDesc = []byte{ @@ -1639,184 +1979,214 @@ var file_api_v1_runtime_common_proto_rawDesc = []byte{ 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x63, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x67, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2c, - 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x75, 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x73, 0x75, 0x62, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x32, - 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, - 0x73, 0x67, 0x22, 0x83, 0x01, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x36, 0x0a, 0x07, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, - 0x07, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x5b, 0x0a, 0x11, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xfc, 0x01, 0x0a, 0x10, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x10, 0x73, 0x74, - 0x64, 0x69, 0x6f, 0x5f, 0x76, 0x69, 0x61, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x64, 0x69, 0x6f, 0x56, 0x69, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x74, 0x64, 0x69, 0x6f, - 0x56, 0x69, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x43, 0x0a, 0x0c, 0x74, 0x74, 0x79, - 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x74, 0x79, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, - 0x00, 0x52, 0x0b, 0x74, 0x74, 0x79, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x4c, - 0x0a, 0x0f, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x35, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x6f, - 0x63, 0x6b, 0x73, 0x35, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x06, 0x0a, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x64, 0x69, 0x6f, 0x56, 0x69, 0x61, - 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x66, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x66, 0x64, 0x22, 0x28, 0x0a, - 0x12, 0x54, 0x74, 0x79, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x97, 0x02, 0x0a, 0x15, 0x53, 0x4f, 0x43, 0x4b, + 0x63, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x32, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x83, 0x01, 0x0a, 0x0e, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, 0x07, 0x66, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, + 0x5b, 0x0a, 0x11, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xfc, 0x01, 0x0a, + 0x10, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x12, 0x4d, 0x0a, 0x10, 0x73, 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x76, 0x69, 0x61, 0x5f, 0x73, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x64, 0x69, 0x6f, 0x56, 0x69, + 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x00, + 0x52, 0x0e, 0x73, 0x74, 0x64, 0x69, 0x6f, 0x56, 0x69, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x12, 0x43, 0x0a, 0x0c, 0x74, 0x74, 0x79, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x74, 0x79, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x46, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x74, 0x79, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x0f, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x35, 0x5f, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x12, 0x2a, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x16, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x4f, 0x43, - 0x4b, 0x53, 0x35, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x40, 0x0a, - 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x20, 0x0a, 0x0c, 0x63, 0x6d, 0x64, 0x5f, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x6d, 0x64, 0x4f, 0x72, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x40, 0x0a, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, - 0x74, 0x22, 0xaa, 0x01, 0x0a, 0x07, 0x53, 0x53, 0x48, 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, - 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x05, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x22, 0xca, - 0x03, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x37, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1b, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, - 0x74, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x42, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x66, 0x6c, - 0x6f, 0x77, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x87, 0x03, 0x0a, 0x12, - 0x4e, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6e, 0x73, - 0x5f, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x6e, 0x73, 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, - 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, - 0x72, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x70, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x78, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x78, 0x5f, 0x70, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x72, 0x78, 0x50, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2a, 0x44, 0x0a, 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x4c, 0x4f, 0x57, - 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4c, - 0x4f, 0x57, 0x5f, 0x45, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0a, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x54, - 0x41, 0x54, 0x53, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x47, 0x52, 0x4f, - 0x55, 0x50, 0x5f, 0x53, 0x59, 0x53, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, - 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x50, 0x55, 0x10, - 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, - 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x59, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, - 0x54, 0x53, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x49, 0x4f, 0x10, 0x04, 0x12, 0x13, 0x0a, - 0x0f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4e, 0x45, 0x54, - 0x10, 0x05, 0x2a, 0x84, 0x01, 0x0a, 0x10, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x49, 0x47, 0x4e, 0x41, - 0x54, 0x55, 0x52, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1e, - 0x0a, 0x1a, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x54, 0x44, 0x49, - 0x4f, 0x5f, 0x56, 0x49, 0x41, 0x5f, 0x53, 0x4f, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x01, 0x12, 0x1a, - 0x0a, 0x16, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x54, 0x59, 0x5f, - 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x49, - 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, 0x44, - 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x55, 0x0a, 0x0a, 0x53, 0x4f, 0x43, - 0x4b, 0x53, 0x35, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x4f, 0x43, 0x4b, 0x53, - 0x35, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, - 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x43, 0x4b, - 0x53, 0x35, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x02, - 0x2a, 0x95, 0x01, 0x0a, 0x11, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, - 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x4f, 0x43, 0x4b, 0x53, - 0x35, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, - 0x50, 0x76, 0x34, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, - 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x4d, - 0x41, 0x49, 0x4e, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x4f, - 0x43, 0x4b, 0x53, 0x35, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x49, 0x50, 0x76, 0x36, 0x10, 0x04, 0x2a, 0x63, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x66, - 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, 0x18, 0x4e, - 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4e, 0x45, 0x54, - 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x54, 0x43, - 0x50, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x50, - 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x44, 0x50, 0x10, 0x02, 0x42, 0x2a, 0x5a, - 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x73, 0x74, - 0x61, 0x69, 0x2f, 0x6b, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x67, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x35, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x57, 0x0a, 0x15, 0x53, + 0x74, 0x64, 0x69, 0x6f, 0x56, 0x69, 0x61, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x46, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x66, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x66, 0x64, 0x22, 0x28, 0x0a, 0x12, 0x54, 0x74, 0x79, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x97, + 0x02, 0x0a, 0x15, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0c, 0x63, 0x6d, 0x64, 0x5f, 0x6f, 0x72, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x6d, + 0x64, 0x4f, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x40, 0x0a, 0x0c, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x4f, 0x43, 0x4b, + 0x53, 0x35, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xaa, 0x01, 0x0a, 0x07, 0x53, 0x53, 0x48, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x05, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x05, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x22, 0xca, 0x03, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x66, 0x6c, 0x6f, + 0x77, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x61, 0x64, 0x64, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x37, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x42, + 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x87, 0x03, 0x0a, 0x12, 0x4e, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, + 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6e, 0x73, 0x5f, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6e, 0x73, 0x51, 0x75, 0x65, 0x73, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x78, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x72, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x09, 0x74, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x72, 0x78, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x09, 0x72, 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x07, + 0x50, 0x53, 0x49, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x5c, 0x0a, + 0x08, 0x50, 0x53, 0x49, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x04, 0x73, 0x6f, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x53, 0x49, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x73, 0x6f, + 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x53, + 0x49, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x83, 0x02, 0x0a, 0x08, + 0x43, 0x70, 0x75, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x75, 0x73, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x4b, + 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x55, 0x73, 0x65, + 0x72, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x10, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x70, 0x73, 0x69, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x53, 0x49, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x03, 0x70, 0x73, + 0x69, 0x22, 0x38, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x14, 0x0a, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xb9, 0x01, 0x0a, 0x0b, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x12, 0x2c, 0x0a, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x3e, 0x0a, 0x0f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x0d, 0x73, 0x77, 0x61, 0x70, 0x4f, 0x6e, 0x6c, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x26, 0x0a, 0x03, 0x70, 0x73, 0x69, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x53, 0x49, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x03, 0x70, 0x73, 0x69, 0x22, 0x3b, 0x0a, 0x09, 0x50, 0x69, 0x64, 0x73, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x22, 0x31, 0x0a, 0x07, 0x49, 0x4f, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, + 0x26, 0x0a, 0x03, 0x70, 0x73, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x53, 0x49, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x03, 0x70, 0x73, 0x69, 0x2a, 0x44, 0x0a, 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x4c, 0x4f, 0x57, + 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x4c, + 0x4f, 0x57, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, + 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x45, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x2a, 0x84, 0x01, + 0x0a, 0x10, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x49, 0x44, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x49, 0x47, + 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x54, 0x44, 0x49, 0x4f, 0x5f, 0x56, 0x49, 0x41, + 0x5f, 0x53, 0x4f, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x49, 0x47, + 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x54, 0x59, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, + 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, + 0x52, 0x45, 0x5f, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, + 0x45, 0x44, 0x10, 0x03, 0x2a, 0x55, 0x0a, 0x0a, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x52, 0x6f, + 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, 0x52, 0x4f, 0x4c, + 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, + 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, + 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, 0x52, 0x4f, + 0x4c, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x02, 0x2a, 0x95, 0x01, 0x0a, 0x11, + 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, 0x41, 0x44, 0x44, 0x52, + 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, 0x41, 0x44, 0x44, + 0x52, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x50, 0x76, 0x34, 0x10, 0x01, + 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, + 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x4e, + 0x41, 0x4d, 0x45, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x4f, 0x43, 0x4b, 0x53, 0x35, 0x5f, + 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x50, 0x76, + 0x36, 0x10, 0x04, 0x2a, 0x63, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, + 0x57, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, + 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x54, 0x43, 0x50, 0x10, 0x01, 0x12, 0x18, + 0x0a, 0x14, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, + 0x4f, 0x4c, 0x5f, 0x55, 0x44, 0x50, 0x10, 0x02, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x73, 0x74, 0x61, 0x69, 0x2f, 0x6b, 0x76, + 0x69, 0x73, 0x6f, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1831,56 +2201,67 @@ func file_api_v1_runtime_common_proto_rawDescGZIP() []byte { return file_api_v1_runtime_common_proto_rawDescData } -var file_api_v1_runtime_common_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_api_v1_runtime_common_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_api_v1_runtime_common_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_api_v1_runtime_common_proto_msgTypes = make([]protoimpl.MessageInfo, 23) var file_api_v1_runtime_common_proto_goTypes = []any{ (FlowDirection)(0), // 0: runtime.v1.FlowDirection - (StatsGroup)(0), // 1: runtime.v1.StatsGroup - (SignatureEventID)(0), // 2: runtime.v1.SignatureEventID - (SOCKS5Role)(0), // 3: runtime.v1.SOCKS5Role - (SOCKS5AddressType)(0), // 4: runtime.v1.SOCKS5AddressType - (NetflowProtocol)(0), // 5: runtime.v1.NetflowProtocol - (*Any)(nil), // 6: runtime.v1.Any - (*Exec)(nil), // 7: runtime.v1.Exec - (*File)(nil), // 8: runtime.v1.File - (*Tuple)(nil), // 9: runtime.v1.Tuple - (*DNS)(nil), // 10: runtime.v1.DNS - (*DNSAnswers)(nil), // 11: runtime.v1.DNSAnswers - (*Stats)(nil), // 12: runtime.v1.Stats - (*LogEvent)(nil), // 13: runtime.v1.LogEvent - (*SignatureEvent)(nil), // 14: runtime.v1.SignatureEvent - (*SignatureMetadata)(nil), // 15: runtime.v1.SignatureMetadata - (*SignatureFinding)(nil), // 16: runtime.v1.SignatureFinding - (*StdioViaSocketFinding)(nil), // 17: runtime.v1.StdioViaSocketFinding - (*TtyDetectedFinding)(nil), // 18: runtime.v1.TtyDetectedFinding - (*SOCKS5DetectedFinding)(nil), // 19: runtime.v1.SOCKS5DetectedFinding - (*SSHData)(nil), // 20: runtime.v1.SSHData - (*Netflow)(nil), // 21: runtime.v1.Netflow - (*NetflowDestination)(nil), // 22: runtime.v1.NetflowDestination + (SignatureEventID)(0), // 1: runtime.v1.SignatureEventID + (SOCKS5Role)(0), // 2: runtime.v1.SOCKS5Role + (SOCKS5AddressType)(0), // 3: runtime.v1.SOCKS5AddressType + (NetflowProtocol)(0), // 4: runtime.v1.NetflowProtocol + (*Any)(nil), // 5: runtime.v1.Any + (*Exec)(nil), // 6: runtime.v1.Exec + (*File)(nil), // 7: runtime.v1.File + (*Tuple)(nil), // 8: runtime.v1.Tuple + (*DNS)(nil), // 9: runtime.v1.DNS + (*DNSAnswers)(nil), // 10: runtime.v1.DNSAnswers + (*LogEvent)(nil), // 11: runtime.v1.LogEvent + (*SignatureEvent)(nil), // 12: runtime.v1.SignatureEvent + (*SignatureMetadata)(nil), // 13: runtime.v1.SignatureMetadata + (*SignatureFinding)(nil), // 14: runtime.v1.SignatureFinding + (*StdioViaSocketFinding)(nil), // 15: runtime.v1.StdioViaSocketFinding + (*TtyDetectedFinding)(nil), // 16: runtime.v1.TtyDetectedFinding + (*SOCKS5DetectedFinding)(nil), // 17: runtime.v1.SOCKS5DetectedFinding + (*SSHData)(nil), // 18: runtime.v1.SSHData + (*Netflow)(nil), // 19: runtime.v1.Netflow + (*NetflowDestination)(nil), // 20: runtime.v1.NetflowDestination + (*PSIData)(nil), // 21: runtime.v1.PSIData + (*PSIStats)(nil), // 22: runtime.v1.PSIStats + (*CpuStats)(nil), // 23: runtime.v1.CpuStats + (*MemoryData)(nil), // 24: runtime.v1.MemoryData + (*MemoryStats)(nil), // 25: runtime.v1.MemoryStats + (*PidsStats)(nil), // 26: runtime.v1.PidsStats + (*IOStats)(nil), // 27: runtime.v1.IOStats } var file_api_v1_runtime_common_proto_depIdxs = []int32{ - 11, // 0: runtime.v1.DNS.answers:type_name -> runtime.v1.DNSAnswers + 10, // 0: runtime.v1.DNS.answers:type_name -> runtime.v1.DNSAnswers 0, // 1: runtime.v1.DNS.flow_direction:type_name -> runtime.v1.FlowDirection - 9, // 2: runtime.v1.DNS.tuple:type_name -> runtime.v1.Tuple - 1, // 3: runtime.v1.Stats.group:type_name -> runtime.v1.StatsGroup - 15, // 4: runtime.v1.SignatureEvent.metadata:type_name -> runtime.v1.SignatureMetadata - 16, // 5: runtime.v1.SignatureEvent.finding:type_name -> runtime.v1.SignatureFinding - 2, // 6: runtime.v1.SignatureMetadata.id:type_name -> runtime.v1.SignatureEventID - 17, // 7: runtime.v1.SignatureFinding.stdio_via_socket:type_name -> runtime.v1.StdioViaSocketFinding - 18, // 8: runtime.v1.SignatureFinding.tty_detected:type_name -> runtime.v1.TtyDetectedFinding - 19, // 9: runtime.v1.SignatureFinding.socks5_detected:type_name -> runtime.v1.SOCKS5DetectedFinding - 3, // 10: runtime.v1.SOCKS5DetectedFinding.role:type_name -> runtime.v1.SOCKS5Role - 0, // 11: runtime.v1.SOCKS5DetectedFinding.flow_direction:type_name -> runtime.v1.FlowDirection - 4, // 12: runtime.v1.SOCKS5DetectedFinding.address_type:type_name -> runtime.v1.SOCKS5AddressType - 0, // 13: runtime.v1.SSHData.flow_direction:type_name -> runtime.v1.FlowDirection - 9, // 14: runtime.v1.SSHData.tuple:type_name -> runtime.v1.Tuple - 5, // 15: runtime.v1.Netflow.protocol:type_name -> runtime.v1.NetflowProtocol - 22, // 16: runtime.v1.Netflow.destinations:type_name -> runtime.v1.NetflowDestination - 17, // [17:17] is the sub-list for method output_type - 17, // [17:17] 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 + 8, // 2: runtime.v1.DNS.tuple:type_name -> runtime.v1.Tuple + 13, // 3: runtime.v1.SignatureEvent.metadata:type_name -> runtime.v1.SignatureMetadata + 14, // 4: runtime.v1.SignatureEvent.finding:type_name -> runtime.v1.SignatureFinding + 1, // 5: runtime.v1.SignatureMetadata.id:type_name -> runtime.v1.SignatureEventID + 15, // 6: runtime.v1.SignatureFinding.stdio_via_socket:type_name -> runtime.v1.StdioViaSocketFinding + 16, // 7: runtime.v1.SignatureFinding.tty_detected:type_name -> runtime.v1.TtyDetectedFinding + 17, // 8: runtime.v1.SignatureFinding.socks5_detected:type_name -> runtime.v1.SOCKS5DetectedFinding + 2, // 9: runtime.v1.SOCKS5DetectedFinding.role:type_name -> runtime.v1.SOCKS5Role + 0, // 10: runtime.v1.SOCKS5DetectedFinding.flow_direction:type_name -> runtime.v1.FlowDirection + 3, // 11: runtime.v1.SOCKS5DetectedFinding.address_type:type_name -> runtime.v1.SOCKS5AddressType + 0, // 12: runtime.v1.SSHData.flow_direction:type_name -> runtime.v1.FlowDirection + 8, // 13: runtime.v1.SSHData.tuple:type_name -> runtime.v1.Tuple + 4, // 14: runtime.v1.Netflow.protocol:type_name -> runtime.v1.NetflowProtocol + 20, // 15: runtime.v1.Netflow.destinations:type_name -> runtime.v1.NetflowDestination + 21, // 16: runtime.v1.PSIStats.some:type_name -> runtime.v1.PSIData + 21, // 17: runtime.v1.PSIStats.full:type_name -> runtime.v1.PSIData + 22, // 18: runtime.v1.CpuStats.psi:type_name -> runtime.v1.PSIStats + 24, // 19: runtime.v1.MemoryStats.usage:type_name -> runtime.v1.MemoryData + 24, // 20: runtime.v1.MemoryStats.swap_only_usage:type_name -> runtime.v1.MemoryData + 22, // 21: runtime.v1.MemoryStats.psi:type_name -> runtime.v1.PSIStats + 22, // 22: runtime.v1.IOStats.psi:type_name -> runtime.v1.PSIStats + 23, // [23:23] is the sub-list for method output_type + 23, // [23:23] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_api_v1_runtime_common_proto_init() } @@ -1888,7 +2269,285 @@ func file_api_v1_runtime_common_proto_init() { if File_api_v1_runtime_common_proto != nil { return } - file_api_v1_runtime_common_proto_msgTypes[10].OneofWrappers = []any{ + if !protoimpl.UnsafeEnabled { + file_api_v1_runtime_common_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*Any); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*Exec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[2].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_api_v1_runtime_common_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*Tuple); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*DNS); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*DNSAnswers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[6].Exporter = func(v any, i int) any { + switch v := v.(*LogEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[7].Exporter = func(v any, i int) any { + switch v := v.(*SignatureEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[8].Exporter = func(v any, i int) any { + switch v := v.(*SignatureMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[9].Exporter = func(v any, i int) any { + switch v := v.(*SignatureFinding); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[10].Exporter = func(v any, i int) any { + switch v := v.(*StdioViaSocketFinding); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[11].Exporter = func(v any, i int) any { + switch v := v.(*TtyDetectedFinding); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[12].Exporter = func(v any, i int) any { + switch v := v.(*SOCKS5DetectedFinding); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[13].Exporter = func(v any, i int) any { + switch v := v.(*SSHData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[14].Exporter = func(v any, i int) any { + switch v := v.(*Netflow); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[15].Exporter = func(v any, i int) any { + switch v := v.(*NetflowDestination); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[16].Exporter = func(v any, i int) any { + switch v := v.(*PSIData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[17].Exporter = func(v any, i int) any { + switch v := v.(*PSIStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[18].Exporter = func(v any, i int) any { + switch v := v.(*CpuStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[19].Exporter = func(v any, i int) any { + switch v := v.(*MemoryData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[20].Exporter = func(v any, i int) any { + switch v := v.(*MemoryStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[21].Exporter = func(v any, i int) any { + switch v := v.(*PidsStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_common_proto_msgTypes[22].Exporter = func(v any, i int) any { + switch v := v.(*IOStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_api_v1_runtime_common_proto_msgTypes[9].OneofWrappers = []any{ (*SignatureFinding_StdioViaSocket)(nil), (*SignatureFinding_TtyDetected)(nil), (*SignatureFinding_Socks5Detected)(nil), @@ -1898,8 +2557,8 @@ func file_api_v1_runtime_common_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_runtime_common_proto_rawDesc, - NumEnums: 6, - NumMessages: 17, + NumEnums: 5, + NumMessages: 23, NumExtensions: 0, NumServices: 0, }, diff --git a/api/v1/runtime/common.proto b/api/v1/runtime/common.proto index 1b38b551..8e02949f 100644 --- a/api/v1/runtime/common.proto +++ b/api/v1/runtime/common.proto @@ -51,21 +51,6 @@ message DNSAnswers { string cname = 6; } -enum StatsGroup { - STATS_GROUP_UNKNOWN = 0; - STATS_GROUP_SYSCALL = 1; - STATS_GROUP_CPU = 2; - STATS_GROUP_MEMORY = 3; - STATS_GROUP_IO = 4; - STATS_GROUP_NET = 5; -} - -message Stats { - StatsGroup group = 1; - uint32 subgroup = 2; - double value = 3; -} - message LogEvent { int32 level = 1; string msg = 2; @@ -172,3 +157,53 @@ message NetflowDestination { uint64 tx_packets = 12; uint64 rx_packets = 13; } + +message PSIData { + uint64 total = 1; +} + +message PSIStats { + PSIData some = 1; + PSIData full = 2; +} + +message CpuStats { + // Total CPU time consumed. + // Units: nanoseconds. + uint64 total_usage = 1; + // Time spent by tasks of the cgroup in kernel mode. + // Units: nanoseconds. + uint64 usage_in_kernelmode = 2; + // Time spent by tasks of the cgroup in user mode. + // Units: nanoseconds. + uint64 usage_in_usermode = 3; + // Number of periods when the container hit its throttling limit. + uint64 throttled_periods = 4; + // Aggregate time the container was throttled for in nanoseconds. + uint64 throttled_time = 5; + + PSIStats psi = 6; +} + +message MemoryData { + uint64 usage = 1; + uint64 limit = 2; +} + +message MemoryStats { + uint64 cache = 1; + MemoryData usage = 2; + MemoryData swap_only_usage = 4; + PSIStats psi = 8; +} + +message PidsStats { + // number of pids in the cgroup + uint64 current = 1; + // active pids hard limit + uint64 limit = 2; +} + +message IOStats { + PSIStats psi = 1; +} diff --git a/api/v1/runtime/runtime_agent_api.pb.go b/api/v1/runtime/runtime_agent_api.pb.go index 870f31a4..73b45c1e 100644 --- a/api/v1/runtime/runtime_agent_api.pb.go +++ b/api/v1/runtime/runtime_agent_api.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.2 -// protoc v5.29.0 +// protoc-gen-go v1.34.2 +// protoc v3.19.4 // source: api/v1/runtime/runtime_agent_api.proto package v1 @@ -270,9 +270,11 @@ type GetConfigurationRequest struct { func (x *GetConfigurationRequest) Reset() { *x = GetConfigurationRequest{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetConfigurationRequest) String() string { @@ -283,7 +285,7 @@ func (*GetConfigurationRequest) ProtoMessage() {} func (x *GetConfigurationRequest) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[0] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -345,9 +347,11 @@ type GetConfigurationResponse struct { func (x *GetConfigurationResponse) Reset() { *x = GetConfigurationResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetConfigurationResponse) String() string { @@ -358,7 +362,7 @@ func (*GetConfigurationResponse) ProtoMessage() {} func (x *GetConfigurationResponse) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[1] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -388,9 +392,11 @@ type Configuration struct { func (x *Configuration) Reset() { *x = Configuration{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Configuration) String() string { @@ -401,7 +407,7 @@ func (*Configuration) ProtoMessage() {} func (x *Configuration) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[2] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -453,9 +459,11 @@ type Event struct { func (x *Event) Reset() { *x = Event{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Event) String() string { @@ -466,7 +474,7 @@ func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[3] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -726,9 +734,11 @@ type ProcessIdentity struct { func (x *ProcessIdentity) Reset() { *x = ProcessIdentity{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ProcessIdentity) String() string { @@ -739,7 +749,7 @@ func (*ProcessIdentity) ProtoMessage() {} func (x *ProcessIdentity) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[4] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -776,9 +786,11 @@ type WriteStreamResponse struct { func (x *WriteStreamResponse) Reset() { *x = WriteStreamResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *WriteStreamResponse) String() string { @@ -789,7 +801,7 @@ func (*WriteStreamResponse) ProtoMessage() {} func (x *WriteStreamResponse) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[5] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -812,9 +824,11 @@ type SendLogsResponse struct { func (x *SendLogsResponse) Reset() { *x = SendLogsResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *SendLogsResponse) String() string { @@ -825,7 +839,7 @@ func (*SendLogsResponse) ProtoMessage() {} func (x *SendLogsResponse) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[6] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -840,30 +854,32 @@ func (*SendLogsResponse) Descriptor() ([]byte, []int) { return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{6} } -type ContainerStatsBatch struct { +type StatsBatch struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Items []*ContainerStats `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Items []*StatsItem `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` } -func (x *ContainerStatsBatch) Reset() { - *x = ContainerStatsBatch{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *StatsBatch) Reset() { + *x = StatsBatch{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (x *ContainerStatsBatch) String() string { +func (x *StatsBatch) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ContainerStatsBatch) ProtoMessage() {} +func (*StatsBatch) ProtoMessage() {} -func (x *ContainerStatsBatch) ProtoReflect() protoreflect.Message { +func (x *StatsBatch) ProtoReflect() protoreflect.Message { mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[7] - if x != nil { + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -873,38 +889,125 @@ func (x *ContainerStatsBatch) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ContainerStatsBatch.ProtoReflect.Descriptor instead. -func (*ContainerStatsBatch) Descriptor() ([]byte, []int) { +// Deprecated: Use StatsBatch.ProtoReflect.Descriptor instead. +func (*StatsBatch) Descriptor() ([]byte, []int) { return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{7} } -func (x *ContainerStatsBatch) GetItems() []*ContainerStats { +func (x *StatsBatch) GetItems() []*StatsItem { if x != nil { return x.Items } return nil } +type StatsItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Data: + // + // *StatsItem_Container + // *StatsItem_Node + Data isStatsItem_Data `protobuf_oneof:"data"` +} + +func (x *StatsItem) Reset() { + *x = StatsItem{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StatsItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatsItem) ProtoMessage() {} + +func (x *StatsItem) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatsItem.ProtoReflect.Descriptor instead. +func (*StatsItem) Descriptor() ([]byte, []int) { + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{8} +} + +func (m *StatsItem) GetData() isStatsItem_Data { + if m != nil { + return m.Data + } + return nil +} + +func (x *StatsItem) GetContainer() *ContainerStats { + if x, ok := x.GetData().(*StatsItem_Container); ok { + return x.Container + } + return nil +} + +func (x *StatsItem) GetNode() *NodeStats { + if x, ok := x.GetData().(*StatsItem_Node); ok { + return x.Node + } + return nil +} + +type isStatsItem_Data interface { + isStatsItem_Data() +} + +type StatsItem_Container struct { + Container *ContainerStats `protobuf:"bytes,1,opt,name=container,proto3,oneof"` +} + +type StatsItem_Node struct { + Node *NodeStats `protobuf:"bytes,2,opt,name=node,proto3,oneof"` +} + +func (*StatsItem_Container) isStatsItem_Data() {} + +func (*StatsItem_Node) isStatsItem_Data() {} + type ContainerStats struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - PodName string `protobuf:"bytes,2,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` - ContainerName string `protobuf:"bytes,3,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` - WorkloadName string `protobuf:"bytes,4,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - WorkloadKind string `protobuf:"bytes,7,opt,name=workload_kind,json=workloadKind,proto3" json:"workload_kind,omitempty"` - PodUid string `protobuf:"bytes,5,opt,name=pod_uid,json=podUid,proto3" json:"pod_uid,omitempty"` - ContainerId string `protobuf:"bytes,6,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` - Stats []*Stats `protobuf:"bytes,21,rep,name=stats,proto3" json:"stats,omitempty"` + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + PodName string `protobuf:"bytes,2,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` + ContainerName string `protobuf:"bytes,3,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` + WorkloadName string `protobuf:"bytes,4,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + WorkloadKind string `protobuf:"bytes,7,opt,name=workload_kind,json=workloadKind,proto3" json:"workload_kind,omitempty"` + PodUid string `protobuf:"bytes,5,opt,name=pod_uid,json=podUid,proto3" json:"pod_uid,omitempty"` + ContainerId string `protobuf:"bytes,6,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` + NodeName string `protobuf:"bytes,8,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + CpuStats *CpuStats `protobuf:"bytes,21,opt,name=cpu_stats,json=cpuStats,proto3" json:"cpu_stats,omitempty"` + MemoryStats *MemoryStats `protobuf:"bytes,22,opt,name=memory_stats,json=memoryStats,proto3" json:"memory_stats,omitempty"` + PidsStats *PidsStats `protobuf:"bytes,23,opt,name=pids_stats,json=pidsStats,proto3" json:"pids_stats,omitempty"` + IoStats *IOStats `protobuf:"bytes,24,opt,name=io_stats,json=ioStats,proto3" json:"io_stats,omitempty"` } func (x *ContainerStats) Reset() { *x = ContainerStats{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ContainerStats) String() string { @@ -914,8 +1017,8 @@ func (x *ContainerStats) String() string { func (*ContainerStats) ProtoMessage() {} func (x *ContainerStats) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[8] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -927,7 +1030,7 @@ func (x *ContainerStats) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerStats.ProtoReflect.Descriptor instead. func (*ContainerStats) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{8} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{9} } func (x *ContainerStats) GetNamespace() string { @@ -979,9 +1082,108 @@ func (x *ContainerStats) GetContainerId() string { return "" } -func (x *ContainerStats) GetStats() []*Stats { +func (x *ContainerStats) GetNodeName() string { + if x != nil { + return x.NodeName + } + return "" +} + +func (x *ContainerStats) GetCpuStats() *CpuStats { if x != nil { - return x.Stats + return x.CpuStats + } + return nil +} + +func (x *ContainerStats) GetMemoryStats() *MemoryStats { + if x != nil { + return x.MemoryStats + } + return nil +} + +func (x *ContainerStats) GetPidsStats() *PidsStats { + if x != nil { + return x.PidsStats + } + return nil +} + +func (x *ContainerStats) GetIoStats() *IOStats { + if x != nil { + return x.IoStats + } + return nil +} + +type NodeStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + CpuStats *CpuStats `protobuf:"bytes,21,opt,name=cpu_stats,json=cpuStats,proto3" json:"cpu_stats,omitempty"` + MemoryStats *MemoryStats `protobuf:"bytes,22,opt,name=memory_stats,json=memoryStats,proto3" json:"memory_stats,omitempty"` + IoStats *IOStats `protobuf:"bytes,23,opt,name=io_stats,json=ioStats,proto3" json:"io_stats,omitempty"` +} + +func (x *NodeStats) Reset() { + *x = NodeStats{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeStats) ProtoMessage() {} + +func (x *NodeStats) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NodeStats.ProtoReflect.Descriptor instead. +func (*NodeStats) Descriptor() ([]byte, []int) { + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{10} +} + +func (x *NodeStats) GetNodeName() string { + if x != nil { + return x.NodeName + } + return "" +} + +func (x *NodeStats) GetCpuStats() *CpuStats { + if x != nil { + return x.CpuStats + } + return nil +} + +func (x *NodeStats) GetMemoryStats() *MemoryStats { + if x != nil { + return x.MemoryStats + } + return nil +} + +func (x *NodeStats) GetIoStats() *IOStats { + if x != nil { + return x.IoStats } return nil } @@ -1008,9 +1210,11 @@ type KubernetesDeltaItem struct { func (x *KubernetesDeltaItem) Reset() { *x = KubernetesDeltaItem{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubernetesDeltaItem) String() string { @@ -1020,8 +1224,8 @@ func (x *KubernetesDeltaItem) String() string { func (*KubernetesDeltaItem) ProtoMessage() {} func (x *KubernetesDeltaItem) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[9] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1033,7 +1237,7 @@ func (x *KubernetesDeltaItem) ProtoReflect() protoreflect.Message { // Deprecated: Use KubernetesDeltaItem.ProtoReflect.Descriptor instead. func (*KubernetesDeltaItem) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{9} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{11} } func (x *KubernetesDeltaItem) GetEvent() KubernetesDeltaItemEvent { @@ -1137,9 +1341,11 @@ type KubernetesDeltaBatch struct { func (x *KubernetesDeltaBatch) Reset() { *x = KubernetesDeltaBatch{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubernetesDeltaBatch) String() string { @@ -1149,8 +1355,8 @@ func (x *KubernetesDeltaBatch) String() string { func (*KubernetesDeltaBatch) ProtoMessage() {} func (x *KubernetesDeltaBatch) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[10] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1162,7 +1368,7 @@ func (x *KubernetesDeltaBatch) ProtoReflect() protoreflect.Message { // Deprecated: Use KubernetesDeltaBatch.ProtoReflect.Descriptor instead. func (*KubernetesDeltaBatch) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{10} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{12} } func (x *KubernetesDeltaBatch) GetItems() []*KubernetesDeltaItem { @@ -1183,9 +1389,11 @@ type Container struct { func (x *Container) Reset() { *x = Container{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Container) String() string { @@ -1195,8 +1403,8 @@ func (x *Container) String() string { func (*Container) ProtoMessage() {} func (x *Container) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[11] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1208,7 +1416,7 @@ func (x *Container) ProtoReflect() protoreflect.Message { // Deprecated: Use Container.ProtoReflect.Descriptor instead. func (*Container) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{11} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{13} } func (x *Container) GetName() string { @@ -1233,9 +1441,11 @@ type KubernetesDeltaIngestResponse struct { func (x *KubernetesDeltaIngestResponse) Reset() { *x = KubernetesDeltaIngestResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubernetesDeltaIngestResponse) String() string { @@ -1245,8 +1455,8 @@ func (x *KubernetesDeltaIngestResponse) String() string { func (*KubernetesDeltaIngestResponse) ProtoMessage() {} func (x *KubernetesDeltaIngestResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[12] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1258,7 +1468,7 @@ func (x *KubernetesDeltaIngestResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KubernetesDeltaIngestResponse.ProtoReflect.Descriptor instead. func (*KubernetesDeltaIngestResponse) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{12} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{14} } type ImageMetadata struct { @@ -1281,9 +1491,11 @@ type ImageMetadata struct { func (x *ImageMetadata) Reset() { *x = ImageMetadata{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ImageMetadata) String() string { @@ -1293,8 +1505,8 @@ func (x *ImageMetadata) String() string { func (*ImageMetadata) ProtoMessage() {} func (x *ImageMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[13] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1306,7 +1518,7 @@ func (x *ImageMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use ImageMetadata.ProtoReflect.Descriptor instead. func (*ImageMetadata) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{13} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{15} } func (x *ImageMetadata) GetImageName() string { @@ -1394,9 +1606,11 @@ type ImageMetadataIngestResponse struct { func (x *ImageMetadataIngestResponse) Reset() { *x = ImageMetadataIngestResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ImageMetadataIngestResponse) String() string { @@ -1406,8 +1620,8 @@ func (x *ImageMetadataIngestResponse) String() string { func (*ImageMetadataIngestResponse) ProtoMessage() {} func (x *ImageMetadataIngestResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[14] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1419,7 +1633,7 @@ func (x *ImageMetadataIngestResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ImageMetadataIngestResponse.ProtoReflect.Descriptor instead. func (*ImageMetadataIngestResponse) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{14} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{16} } type GetSyncStateRequest struct { @@ -1432,9 +1646,11 @@ type GetSyncStateRequest struct { func (x *GetSyncStateRequest) Reset() { *x = GetSyncStateRequest{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetSyncStateRequest) String() string { @@ -1444,8 +1660,8 @@ func (x *GetSyncStateRequest) String() string { func (*GetSyncStateRequest) ProtoMessage() {} func (x *GetSyncStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[15] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1457,7 +1673,7 @@ func (x *GetSyncStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSyncStateRequest.ProtoReflect.Descriptor instead. func (*GetSyncStateRequest) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{15} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{17} } func (x *GetSyncStateRequest) GetImageIds() []string { @@ -1477,9 +1693,11 @@ type GetSyncStateResponse struct { func (x *GetSyncStateResponse) Reset() { *x = GetSyncStateResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *GetSyncStateResponse) String() string { @@ -1489,8 +1707,8 @@ func (x *GetSyncStateResponse) String() string { func (*GetSyncStateResponse) ProtoMessage() {} func (x *GetSyncStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[16] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1502,7 +1720,7 @@ func (x *GetSyncStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSyncStateResponse.ProtoReflect.Descriptor instead. func (*GetSyncStateResponse) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{16} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{18} } func (x *GetSyncStateResponse) GetImages() *ImagesSyncState { @@ -1523,9 +1741,11 @@ type ImagesSyncState struct { func (x *ImagesSyncState) Reset() { *x = ImagesSyncState{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ImagesSyncState) String() string { @@ -1535,8 +1755,8 @@ func (x *ImagesSyncState) String() string { func (*ImagesSyncState) ProtoMessage() {} func (x *ImagesSyncState) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[17] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1548,7 +1768,7 @@ func (x *ImagesSyncState) ProtoReflect() protoreflect.Message { // Deprecated: Use ImagesSyncState.ProtoReflect.Descriptor instead. func (*ImagesSyncState) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{17} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{19} } func (x *ImagesSyncState) GetFullResyncRequired() bool { @@ -1580,9 +1800,11 @@ type Image struct { func (x *Image) Reset() { *x = Image{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Image) String() string { @@ -1592,8 +1814,8 @@ func (x *Image) String() string { func (*Image) ProtoMessage() {} func (x *Image) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[18] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1605,7 +1827,7 @@ func (x *Image) ProtoReflect() protoreflect.Message { // Deprecated: Use Image.ProtoReflect.Descriptor instead. func (*Image) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{18} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{20} } func (x *Image) GetId() string { @@ -1661,9 +1883,11 @@ type UpdateSyncStateRequest struct { func (x *UpdateSyncStateRequest) Reset() { *x = UpdateSyncStateRequest{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *UpdateSyncStateRequest) String() string { @@ -1673,8 +1897,8 @@ func (x *UpdateSyncStateRequest) String() string { func (*UpdateSyncStateRequest) ProtoMessage() {} func (x *UpdateSyncStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[19] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1686,7 +1910,7 @@ func (x *UpdateSyncStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateSyncStateRequest.ProtoReflect.Descriptor instead. func (*UpdateSyncStateRequest) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{19} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{21} } func (x *UpdateSyncStateRequest) GetFullSnapshot() bool { @@ -1711,9 +1935,11 @@ type UpdateSyncStateResponse struct { func (x *UpdateSyncStateResponse) Reset() { *x = UpdateSyncStateResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *UpdateSyncStateResponse) String() string { @@ -1723,8 +1949,8 @@ func (x *UpdateSyncStateResponse) String() string { func (*UpdateSyncStateResponse) ProtoMessage() {} func (x *UpdateSyncStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[20] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1736,7 +1962,7 @@ func (x *UpdateSyncStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateSyncStateResponse.ProtoReflect.Descriptor instead. func (*UpdateSyncStateResponse) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{20} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{22} } type KubeBenchReport struct { @@ -1750,9 +1976,11 @@ type KubeBenchReport struct { func (x *KubeBenchReport) Reset() { *x = KubeBenchReport{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubeBenchReport) String() string { @@ -1762,8 +1990,8 @@ func (x *KubeBenchReport) String() string { func (*KubeBenchReport) ProtoMessage() {} func (x *KubeBenchReport) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[21] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1775,7 +2003,7 @@ func (x *KubeBenchReport) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeBenchReport.ProtoReflect.Descriptor instead. func (*KubeBenchReport) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{21} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{23} } func (x *KubeBenchReport) GetControls() []*KubeBenchControls { @@ -1800,9 +2028,11 @@ type KubeBenchReportIngestResponse struct { func (x *KubeBenchReportIngestResponse) Reset() { *x = KubeBenchReportIngestResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubeBenchReportIngestResponse) String() string { @@ -1812,8 +2042,8 @@ func (x *KubeBenchReportIngestResponse) String() string { func (*KubeBenchReportIngestResponse) ProtoMessage() {} func (x *KubeBenchReportIngestResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[22] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1825,7 +2055,7 @@ func (x *KubeBenchReportIngestResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeBenchReportIngestResponse.ProtoReflect.Descriptor instead. func (*KubeBenchReportIngestResponse) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{22} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{24} } type KubeBenchNode struct { @@ -1839,9 +2069,11 @@ type KubeBenchNode struct { func (x *KubeBenchNode) Reset() { *x = KubeBenchNode{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubeBenchNode) String() string { @@ -1851,8 +2083,8 @@ func (x *KubeBenchNode) String() string { func (*KubeBenchNode) ProtoMessage() {} func (x *KubeBenchNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[23] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1864,7 +2096,7 @@ func (x *KubeBenchNode) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeBenchNode.ProtoReflect.Descriptor instead. func (*KubeBenchNode) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{23} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{25} } func (x *KubeBenchNode) GetNodeName() string { @@ -1892,9 +2124,11 @@ type KubeBenchControls struct { func (x *KubeBenchControls) Reset() { *x = KubeBenchControls{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubeBenchControls) String() string { @@ -1904,8 +2138,8 @@ func (x *KubeBenchControls) String() string { func (*KubeBenchControls) ProtoMessage() {} func (x *KubeBenchControls) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[24] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1917,7 +2151,7 @@ func (x *KubeBenchControls) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeBenchControls.ProtoReflect.Descriptor instead. func (*KubeBenchControls) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{24} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{26} } func (x *KubeBenchControls) GetVersion() string { @@ -1944,9 +2178,11 @@ type KubeBenchGroup struct { func (x *KubeBenchGroup) Reset() { *x = KubeBenchGroup{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubeBenchGroup) String() string { @@ -1956,8 +2192,8 @@ func (x *KubeBenchGroup) String() string { func (*KubeBenchGroup) ProtoMessage() {} func (x *KubeBenchGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[25] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1969,7 +2205,7 @@ func (x *KubeBenchGroup) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeBenchGroup.ProtoReflect.Descriptor instead. func (*KubeBenchGroup) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{25} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{27} } func (x *KubeBenchGroup) GetChecks() []*KubeBenchCheck { @@ -1992,9 +2228,11 @@ type KubeBenchCheck struct { func (x *KubeBenchCheck) Reset() { *x = KubeBenchCheck{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubeBenchCheck) String() string { @@ -2004,8 +2242,8 @@ func (x *KubeBenchCheck) String() string { func (*KubeBenchCheck) ProtoMessage() {} func (x *KubeBenchCheck) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[26] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2017,7 +2255,7 @@ func (x *KubeBenchCheck) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeBenchCheck.ProtoReflect.Descriptor instead. func (*KubeBenchCheck) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{26} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{28} } func (x *KubeBenchCheck) GetId() string { @@ -2058,9 +2296,11 @@ type KubeLinterReport struct { func (x *KubeLinterReport) Reset() { *x = KubeLinterReport{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubeLinterReport) String() string { @@ -2070,8 +2310,8 @@ func (x *KubeLinterReport) String() string { func (*KubeLinterReport) ProtoMessage() {} func (x *KubeLinterReport) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[27] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2083,7 +2323,7 @@ func (x *KubeLinterReport) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeLinterReport.ProtoReflect.Descriptor instead. func (*KubeLinterReport) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{27} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{29} } func (x *KubeLinterReport) GetChecks() []*KubeLinterCheck { @@ -2101,9 +2341,11 @@ type KubeLinterReportIngestResponse struct { func (x *KubeLinterReportIngestResponse) Reset() { *x = KubeLinterReportIngestResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubeLinterReportIngestResponse) String() string { @@ -2113,8 +2355,8 @@ func (x *KubeLinterReportIngestResponse) String() string { func (*KubeLinterReportIngestResponse) ProtoMessage() {} func (x *KubeLinterReportIngestResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[28] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2126,7 +2368,7 @@ func (x *KubeLinterReportIngestResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeLinterReportIngestResponse.ProtoReflect.Descriptor instead. func (*KubeLinterReportIngestResponse) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{28} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{30} } type KubeLinterCheck struct { @@ -2141,9 +2383,11 @@ type KubeLinterCheck struct { func (x *KubeLinterCheck) Reset() { *x = KubeLinterCheck{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *KubeLinterCheck) String() string { @@ -2153,8 +2397,8 @@ func (x *KubeLinterCheck) String() string { func (*KubeLinterCheck) ProtoMessage() {} func (x *KubeLinterCheck) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[29] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2166,7 +2410,7 @@ func (x *KubeLinterCheck) ProtoReflect() protoreflect.Message { // Deprecated: Use KubeLinterCheck.ProtoReflect.Descriptor instead. func (*KubeLinterCheck) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{29} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{31} } func (x *KubeLinterCheck) GetResourceUid() string { @@ -2206,9 +2450,11 @@ type Process struct { func (x *Process) Reset() { *x = Process{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *Process) String() string { @@ -2218,8 +2464,8 @@ func (x *Process) String() string { func (*Process) ProtoMessage() {} func (x *Process) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[30] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2231,7 +2477,7 @@ func (x *Process) ProtoReflect() protoreflect.Message { // Deprecated: Use Process.ProtoReflect.Descriptor instead. func (*Process) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{30} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{32} } func (x *Process) GetPid() uint32 { @@ -2296,9 +2542,11 @@ type ProcessEvent struct { func (x *ProcessEvent) Reset() { *x = ProcessEvent{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ProcessEvent) String() string { @@ -2308,8 +2556,8 @@ func (x *ProcessEvent) String() string { func (*ProcessEvent) ProtoMessage() {} func (x *ProcessEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[31] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2321,7 +2569,7 @@ func (x *ProcessEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ProcessEvent.ProtoReflect.Descriptor instead. func (*ProcessEvent) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{31} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{33} } func (x *ProcessEvent) GetTimestamp() uint64 { @@ -2363,9 +2611,11 @@ type ProcessTreeEvent struct { func (x *ProcessTreeEvent) Reset() { *x = ProcessTreeEvent{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ProcessTreeEvent) String() string { @@ -2375,8 +2625,8 @@ func (x *ProcessTreeEvent) String() string { func (*ProcessTreeEvent) ProtoMessage() {} func (x *ProcessTreeEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[32] - if x != nil { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2388,7 +2638,7 @@ func (x *ProcessTreeEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ProcessTreeEvent.ProtoReflect.Descriptor instead. func (*ProcessTreeEvent) Descriptor() ([]byte, []int) { - return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{32} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{34} } func (x *ProcessTreeEvent) GetInitial() bool { @@ -2512,12 +2762,19 @@ var file_api_v1_runtime_runtime_agent_api_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x0a, 0x13, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x12, 0x30, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x69, 0x74, - 0x65, 0x6d, 0x73, 0x22, 0x9f, 0x02, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x0a, 0x0a, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x2b, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x7c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x73, 0x49, 0x74, + 0x65, 0x6d, 0x12, 0x3a, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x2b, + 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x22, 0xe8, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, @@ -2532,332 +2789,357 @@ var file_api_v1_runtime_runtime_agent_api_proto_rawDesc = []byte{ 0x12, 0x17, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0xcd, 0x06, 0x0a, 0x13, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, - 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x3a, 0x0a, - 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, - 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, - 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x11, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x42, 0x0a, 0x11, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x10, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, - 0x28, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, - 0x75, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x56, 0x0a, 0x0d, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x31, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x63, 0x70, 0x75, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x70, 0x75, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x0c, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x16, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0b, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x69, 0x64, 0x73, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x64, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x52, 0x09, 0x70, 0x69, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, + 0x0a, 0x08, 0x69, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x4f, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x07, 0x69, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0xc7, + 0x01, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x63, 0x70, 0x75, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x70, 0x75, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x0c, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x16, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0b, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x08, 0x69, 0x6f, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x4f, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x07, 0x69, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0xcd, 0x06, 0x0a, 0x13, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, + 0x12, 0x3a, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x24, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x70, 0x69, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x11, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x42, + 0x0a, 0x11, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x56, 0x0a, 0x0d, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, + 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x12, 0x65, 0x0a, 0x12, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x36, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x74, 0x65, - 0x6d, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x12, 0x65, 0x0a, 0x12, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, - 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, - 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x1a, 0x3f, - 0x0a, 0x11, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x44, 0x0a, 0x16, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4d, 0x0a, 0x14, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, - 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x35, 0x0a, - 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, - 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, - 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3e, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf6, 0x02, 0x0a, 0x0d, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, - 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x69, - 0x67, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x72, 0x63, 0x68, - 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6f, 0x73, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x73, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x0c, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, - 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, - 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1f, 0x0a, - 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x1d, - 0x0a, 0x1b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x49, - 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x64, - 0x73, 0x22, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x53, 0x79, 0x6e, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x22, 0x6e, - 0x0a, 0x0f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x79, 0x6e, 0x63, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x66, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x22, 0xcf, - 0x01, 0x0a, 0x05, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x64, 0x73, 0x12, 0x3c, 0x0a, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x73, 0x63, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0x68, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x75, - 0x6c, 0x6c, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x66, 0x75, 0x6c, 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, - 0x29, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7b, 0x0a, 0x0f, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, - 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, - 0x64, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x0d, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x55, 0x69, 0x64, 0x22, 0x61, 0x0a, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x44, 0x0a, 0x0e, 0x4b, 0x75, 0x62, 0x65, 0x42, - 0x65, 0x6e, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0x67, 0x0a, - 0x0e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x65, 0x78, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x47, 0x0a, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x4c, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x33, 0x0a, 0x06, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x4c, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, - 0x20, 0x0a, 0x1e, 0x4b, 0x75, 0x62, 0x65, 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x64, 0x0a, 0x0f, 0x4b, 0x75, 0x62, 0x65, 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x55, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x73, 0x73, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x70, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x22, 0xb1, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5e, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x54, 0x72, 0x65, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2a, 0xab, 0x02, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x4e, 0x53, 0x10, 0x02, 0x12, - 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x43, 0x50, 0x5f, 0x43, 0x4f, 0x4e, - 0x4e, 0x45, 0x43, 0x54, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x43, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x43, 0x50, - 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x06, - 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, - 0x53, 0x5f, 0x4f, 0x4f, 0x4d, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x4d, 0x41, 0x47, 0x49, 0x43, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x08, 0x12, 0x13, - 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, - 0x45, 0x10, 0x09, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x54, 0x59, - 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x53, 0x54, 0x44, 0x49, 0x4f, 0x5f, 0x56, 0x49, 0x41, 0x5f, 0x53, 0x4f, 0x43, 0x4b, - 0x45, 0x54, 0x10, 0x0b, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x53, - 0x48, 0x10, 0x0c, 0x12, 0x0e, 0x0a, 0x09, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x4e, 0x59, - 0x10, 0xe7, 0x07, 0x2a, 0x4d, 0x0a, 0x18, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, - 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x0d, 0x0a, 0x09, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x5f, 0x41, 0x44, 0x44, 0x10, 0x00, 0x12, 0x10, - 0x0a, 0x0c, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x01, - 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, - 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x0f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, 0x61, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, - 0x53, 0x43, 0x41, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x53, - 0x43, 0x41, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x4e, - 0x45, 0x44, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x43, - 0x41, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x43, 0x41, - 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x03, 0x2a, 0x76, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, - 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, - 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, - 0x52, 0x4b, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x10, 0x03, 0x32, 0xdc, 0x09, - 0x0a, 0x17, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x50, 0x49, 0x12, 0x5f, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x6d, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, + 0x63, 0x1a, 0x3f, 0x0a, 0x11, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4d, 0x0a, 0x14, 0x4b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x12, 0x35, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, + 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3e, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x4b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf6, 0x02, 0x0a, 0x0d, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, + 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, + 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6f, + 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, + 0x65, 0x22, 0x1d, 0x0a, 0x1b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x32, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x49, 0x64, 0x73, 0x22, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, + 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x73, 0x22, 0x6e, 0x0a, 0x0f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x73, + 0x79, 0x6e, 0x63, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x12, 0x66, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x05, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x3c, 0x0a, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, + 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x73, 0x63, 0x61, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x68, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6e, + 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, + 0x0d, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x75, 0x6c, 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x22, 0x19, 0x0a, + 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7b, 0x0a, 0x0f, 0x4b, 0x75, 0x62, 0x65, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x08, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, + 0x65, 0x6e, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x52, 0x08, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x0d, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x55, 0x69, 0x64, 0x22, 0x61, 0x0a, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x42, + 0x65, 0x6e, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x44, 0x0a, 0x0e, 0x4b, 0x75, + 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x32, 0x0a, 0x06, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x22, 0x67, 0x0a, 0x0e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x47, 0x0a, 0x10, 0x4b, 0x75, 0x62, + 0x65, 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x33, 0x0a, + 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x4c, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x4b, 0x75, 0x62, 0x65, 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x0f, 0x4b, 0x75, 0x62, 0x65, 0x4c, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, + 0x73, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x73, 0x73, + 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x07, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x70, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x70, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x22, 0xb1, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x07, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5e, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x54, 0x72, 0x65, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2a, 0xab, 0x02, 0x0a, 0x09, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x58, 0x45, + 0x43, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x4e, 0x53, + 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x43, 0x50, 0x5f, + 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x43, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x43, 0x50, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, + 0x45, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, + 0x43, 0x45, 0x53, 0x53, 0x5f, 0x4f, 0x4f, 0x4d, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x4d, 0x41, 0x47, 0x49, 0x43, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, + 0x08, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, + 0x54, 0x55, 0x52, 0x45, 0x10, 0x09, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x54, 0x59, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x44, 0x49, 0x4f, 0x5f, 0x56, 0x49, 0x41, 0x5f, 0x53, + 0x4f, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x0b, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x53, 0x53, 0x48, 0x10, 0x0c, 0x12, 0x0e, 0x0a, 0x09, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x41, 0x4e, 0x59, 0x10, 0xe7, 0x07, 0x2a, 0x4d, 0x0a, 0x18, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x5f, 0x41, 0x44, 0x44, 0x10, + 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, + 0x45, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x5f, 0x52, 0x45, 0x4d, + 0x4f, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x0f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, + 0x63, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x49, 0x4d, 0x41, + 0x47, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x49, 0x4d, 0x41, 0x47, + 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x43, + 0x41, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x49, 0x4d, 0x41, 0x47, 0x45, + 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, + 0x53, 0x43, 0x41, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x43, 0x41, 0x4e, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x2a, 0x76, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x4f, + 0x43, 0x45, 0x53, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x10, 0x01, 0x12, 0x17, + 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x43, 0x45, + 0x53, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x10, 0x03, + 0x32, 0xca, 0x09, 0x0a, 0x17, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x50, 0x49, 0x12, 0x5f, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x11, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, - 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x1a, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0f, 0x4c, 0x6f, 0x67, 0x73, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x1a, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x61, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x12, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x1a, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x12, 0x23, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, + 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x12, 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0f, 0x4c, 0x6f, + 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x1a, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4e, 0x0a, 0x12, 0x4e, 0x65, 0x74, 0x66, - 0x6c, 0x6f, 0x77, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x13, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x66, - 0x6c, 0x6f, 0x77, 0x1a, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4f, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x16, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x1a, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4e, 0x0a, 0x12, 0x4e, 0x65, 0x74, + 0x66, 0x6c, 0x6f, 0x77, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, + 0x13, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, + 0x66, 0x6c, 0x6f, 0x77, 0x1a, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5d, 0x0a, 0x18, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x72, 0x65, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x1a, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5d, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x72, 0x65, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x1a, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x53, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, - 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x53, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, + 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0f, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x22, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x1a, 0x4b, 0x75, - 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, - 0x44, 0x65, 0x6c, 0x74, 0x61, 0x42, 0x61, 0x74, 0x63, 0x68, 0x1a, 0x29, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x15, 0x4b, - 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x6e, - 0x67, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, - 0x61, 0x49, 0x74, 0x65, 0x6d, 0x1a, 0x29, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, + 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x22, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x1a, 0x4b, + 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, + 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x42, 0x61, 0x74, 0x63, 0x68, 0x1a, 0x29, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x15, + 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x49, + 0x6e, 0x67, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, 0x6c, - 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x13, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x12, 0x19, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x27, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x15, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x16, 0x4b, 0x75, 0x62, 0x65, 0x4c, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, - 0x62, 0x65, 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2a, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, - 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2a, 0x5a, 0x28, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x73, 0x74, 0x61, - 0x69, 0x2f, 0x6b, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x1a, 0x29, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x44, 0x65, + 0x6c, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x13, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x12, 0x19, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x27, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x15, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, + 0x65, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x29, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x16, 0x4b, 0x75, 0x62, 0x65, 0x4c, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x75, 0x62, 0x65, 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x1a, + 0x2a, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, + 0x65, 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x67, + 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2a, 0x5a, + 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x73, 0x74, + 0x61, 0x69, 0x2f, 0x6b, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -2873,7 +3155,7 @@ func file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP() []byte { } var file_api_v1_runtime_runtime_agent_api_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_api_v1_runtime_runtime_agent_api_proto_msgTypes = make([]protoimpl.MessageInfo, 37) +var file_api_v1_runtime_runtime_agent_api_proto_msgTypes = make([]protoimpl.MessageInfo, 39) var file_api_v1_runtime_runtime_agent_api_proto_goTypes = []any{ (EventType)(0), // 0: runtime.v1.EventType (KubernetesDeltaItemEvent)(0), // 1: runtime.v1.KubernetesDeltaItemEvent @@ -2886,115 +3168,128 @@ var file_api_v1_runtime_runtime_agent_api_proto_goTypes = []any{ (*ProcessIdentity)(nil), // 8: runtime.v1.ProcessIdentity (*WriteStreamResponse)(nil), // 9: runtime.v1.WriteStreamResponse (*SendLogsResponse)(nil), // 10: runtime.v1.SendLogsResponse - (*ContainerStatsBatch)(nil), // 11: runtime.v1.ContainerStatsBatch - (*ContainerStats)(nil), // 12: runtime.v1.ContainerStats - (*KubernetesDeltaItem)(nil), // 13: runtime.v1.KubernetesDeltaItem - (*KubernetesDeltaBatch)(nil), // 14: runtime.v1.KubernetesDeltaBatch - (*Container)(nil), // 15: runtime.v1.Container - (*KubernetesDeltaIngestResponse)(nil), // 16: runtime.v1.KubernetesDeltaIngestResponse - (*ImageMetadata)(nil), // 17: runtime.v1.ImageMetadata - (*ImageMetadataIngestResponse)(nil), // 18: runtime.v1.ImageMetadataIngestResponse - (*GetSyncStateRequest)(nil), // 19: runtime.v1.GetSyncStateRequest - (*GetSyncStateResponse)(nil), // 20: runtime.v1.GetSyncStateResponse - (*ImagesSyncState)(nil), // 21: runtime.v1.ImagesSyncState - (*Image)(nil), // 22: runtime.v1.Image - (*UpdateSyncStateRequest)(nil), // 23: runtime.v1.UpdateSyncStateRequest - (*UpdateSyncStateResponse)(nil), // 24: runtime.v1.UpdateSyncStateResponse - (*KubeBenchReport)(nil), // 25: runtime.v1.KubeBenchReport - (*KubeBenchReportIngestResponse)(nil), // 26: runtime.v1.KubeBenchReportIngestResponse - (*KubeBenchNode)(nil), // 27: runtime.v1.KubeBenchNode - (*KubeBenchControls)(nil), // 28: runtime.v1.KubeBenchControls - (*KubeBenchGroup)(nil), // 29: runtime.v1.KubeBenchGroup - (*KubeBenchCheck)(nil), // 30: runtime.v1.KubeBenchCheck - (*KubeLinterReport)(nil), // 31: runtime.v1.KubeLinterReport - (*KubeLinterReportIngestResponse)(nil), // 32: runtime.v1.KubeLinterReportIngestResponse - (*KubeLinterCheck)(nil), // 33: runtime.v1.KubeLinterCheck - (*Process)(nil), // 34: runtime.v1.Process - (*ProcessEvent)(nil), // 35: runtime.v1.ProcessEvent - (*ProcessTreeEvent)(nil), // 36: runtime.v1.ProcessTreeEvent - nil, // 37: runtime.v1.Event.ObjectLabelsEntry - nil, // 38: runtime.v1.Event.ObjectAnnotationsEntry - nil, // 39: runtime.v1.KubernetesDeltaItem.ObjectLabelsEntry - nil, // 40: runtime.v1.KubernetesDeltaItem.ObjectAnnotationsEntry - (*Exec)(nil), // 41: runtime.v1.Exec - (*DNS)(nil), // 42: runtime.v1.DNS - (*File)(nil), // 43: runtime.v1.File - (*Tuple)(nil), // 44: runtime.v1.Tuple - (*SignatureEvent)(nil), // 45: runtime.v1.SignatureEvent - (*Any)(nil), // 46: runtime.v1.Any - (*StdioViaSocketFinding)(nil), // 47: runtime.v1.StdioViaSocketFinding - (*SSHData)(nil), // 48: runtime.v1.SSHData - (*Stats)(nil), // 49: runtime.v1.Stats - (*timestamppb.Timestamp)(nil), // 50: google.protobuf.Timestamp - (*LogEvent)(nil), // 51: runtime.v1.LogEvent - (*Netflow)(nil), // 52: runtime.v1.Netflow + (*StatsBatch)(nil), // 11: runtime.v1.StatsBatch + (*StatsItem)(nil), // 12: runtime.v1.StatsItem + (*ContainerStats)(nil), // 13: runtime.v1.ContainerStats + (*NodeStats)(nil), // 14: runtime.v1.NodeStats + (*KubernetesDeltaItem)(nil), // 15: runtime.v1.KubernetesDeltaItem + (*KubernetesDeltaBatch)(nil), // 16: runtime.v1.KubernetesDeltaBatch + (*Container)(nil), // 17: runtime.v1.Container + (*KubernetesDeltaIngestResponse)(nil), // 18: runtime.v1.KubernetesDeltaIngestResponse + (*ImageMetadata)(nil), // 19: runtime.v1.ImageMetadata + (*ImageMetadataIngestResponse)(nil), // 20: runtime.v1.ImageMetadataIngestResponse + (*GetSyncStateRequest)(nil), // 21: runtime.v1.GetSyncStateRequest + (*GetSyncStateResponse)(nil), // 22: runtime.v1.GetSyncStateResponse + (*ImagesSyncState)(nil), // 23: runtime.v1.ImagesSyncState + (*Image)(nil), // 24: runtime.v1.Image + (*UpdateSyncStateRequest)(nil), // 25: runtime.v1.UpdateSyncStateRequest + (*UpdateSyncStateResponse)(nil), // 26: runtime.v1.UpdateSyncStateResponse + (*KubeBenchReport)(nil), // 27: runtime.v1.KubeBenchReport + (*KubeBenchReportIngestResponse)(nil), // 28: runtime.v1.KubeBenchReportIngestResponse + (*KubeBenchNode)(nil), // 29: runtime.v1.KubeBenchNode + (*KubeBenchControls)(nil), // 30: runtime.v1.KubeBenchControls + (*KubeBenchGroup)(nil), // 31: runtime.v1.KubeBenchGroup + (*KubeBenchCheck)(nil), // 32: runtime.v1.KubeBenchCheck + (*KubeLinterReport)(nil), // 33: runtime.v1.KubeLinterReport + (*KubeLinterReportIngestResponse)(nil), // 34: runtime.v1.KubeLinterReportIngestResponse + (*KubeLinterCheck)(nil), // 35: runtime.v1.KubeLinterCheck + (*Process)(nil), // 36: runtime.v1.Process + (*ProcessEvent)(nil), // 37: runtime.v1.ProcessEvent + (*ProcessTreeEvent)(nil), // 38: runtime.v1.ProcessTreeEvent + nil, // 39: runtime.v1.Event.ObjectLabelsEntry + nil, // 40: runtime.v1.Event.ObjectAnnotationsEntry + nil, // 41: runtime.v1.KubernetesDeltaItem.ObjectLabelsEntry + nil, // 42: runtime.v1.KubernetesDeltaItem.ObjectAnnotationsEntry + (*Exec)(nil), // 43: runtime.v1.Exec + (*DNS)(nil), // 44: runtime.v1.DNS + (*File)(nil), // 45: runtime.v1.File + (*Tuple)(nil), // 46: runtime.v1.Tuple + (*SignatureEvent)(nil), // 47: runtime.v1.SignatureEvent + (*Any)(nil), // 48: runtime.v1.Any + (*StdioViaSocketFinding)(nil), // 49: runtime.v1.StdioViaSocketFinding + (*SSHData)(nil), // 50: runtime.v1.SSHData + (*CpuStats)(nil), // 51: runtime.v1.CpuStats + (*MemoryStats)(nil), // 52: runtime.v1.MemoryStats + (*PidsStats)(nil), // 53: runtime.v1.PidsStats + (*IOStats)(nil), // 54: runtime.v1.IOStats + (*timestamppb.Timestamp)(nil), // 55: google.protobuf.Timestamp + (*LogEvent)(nil), // 56: runtime.v1.LogEvent + (*Netflow)(nil), // 57: runtime.v1.Netflow } var file_api_v1_runtime_runtime_agent_api_proto_depIdxs = []int32{ 6, // 0: runtime.v1.GetConfigurationResponse.config:type_name -> runtime.v1.Configuration 0, // 1: runtime.v1.Event.event_type:type_name -> runtime.v1.EventType - 37, // 2: runtime.v1.Event.object_labels:type_name -> runtime.v1.Event.ObjectLabelsEntry - 38, // 3: runtime.v1.Event.object_annotations:type_name -> runtime.v1.Event.ObjectAnnotationsEntry + 39, // 2: runtime.v1.Event.object_labels:type_name -> runtime.v1.Event.ObjectLabelsEntry + 40, // 3: runtime.v1.Event.object_annotations:type_name -> runtime.v1.Event.ObjectAnnotationsEntry 8, // 4: runtime.v1.Event.process_identity:type_name -> runtime.v1.ProcessIdentity - 41, // 5: runtime.v1.Event.exec:type_name -> runtime.v1.Exec - 42, // 6: runtime.v1.Event.dns:type_name -> runtime.v1.DNS - 43, // 7: runtime.v1.Event.file:type_name -> runtime.v1.File - 44, // 8: runtime.v1.Event.tuple:type_name -> runtime.v1.Tuple - 45, // 9: runtime.v1.Event.signature:type_name -> runtime.v1.SignatureEvent - 46, // 10: runtime.v1.Event.any:type_name -> runtime.v1.Any - 47, // 11: runtime.v1.Event.stdio_via_socket:type_name -> runtime.v1.StdioViaSocketFinding - 48, // 12: runtime.v1.Event.ssh:type_name -> runtime.v1.SSHData - 12, // 13: runtime.v1.ContainerStatsBatch.items:type_name -> runtime.v1.ContainerStats - 49, // 14: runtime.v1.ContainerStats.stats:type_name -> runtime.v1.Stats - 1, // 15: runtime.v1.KubernetesDeltaItem.event:type_name -> runtime.v1.KubernetesDeltaItemEvent - 50, // 16: runtime.v1.KubernetesDeltaItem.object_created_at:type_name -> google.protobuf.Timestamp - 15, // 17: runtime.v1.KubernetesDeltaItem.object_containers:type_name -> runtime.v1.Container - 39, // 18: runtime.v1.KubernetesDeltaItem.object_labels:type_name -> runtime.v1.KubernetesDeltaItem.ObjectLabelsEntry - 40, // 19: runtime.v1.KubernetesDeltaItem.object_annotations:type_name -> runtime.v1.KubernetesDeltaItem.ObjectAnnotationsEntry - 13, // 20: runtime.v1.KubernetesDeltaBatch.items:type_name -> runtime.v1.KubernetesDeltaItem - 50, // 21: runtime.v1.ImageMetadata.created_at:type_name -> google.protobuf.Timestamp - 21, // 22: runtime.v1.GetSyncStateResponse.images:type_name -> runtime.v1.ImagesSyncState - 22, // 23: runtime.v1.ImagesSyncState.images:type_name -> runtime.v1.Image - 2, // 24: runtime.v1.Image.scan_status:type_name -> runtime.v1.ImageScanStatus - 22, // 25: runtime.v1.UpdateSyncStateRequest.images:type_name -> runtime.v1.Image - 28, // 26: runtime.v1.KubeBenchReport.controls:type_name -> runtime.v1.KubeBenchControls - 27, // 27: runtime.v1.KubeBenchReport.node:type_name -> runtime.v1.KubeBenchNode - 29, // 28: runtime.v1.KubeBenchControls.groups:type_name -> runtime.v1.KubeBenchGroup - 30, // 29: runtime.v1.KubeBenchGroup.checks:type_name -> runtime.v1.KubeBenchCheck - 33, // 30: runtime.v1.KubeLinterReport.checks:type_name -> runtime.v1.KubeLinterCheck - 34, // 31: runtime.v1.ProcessEvent.process:type_name -> runtime.v1.Process - 3, // 32: runtime.v1.ProcessEvent.action:type_name -> runtime.v1.ProcessAction - 35, // 33: runtime.v1.ProcessTreeEvent.events:type_name -> runtime.v1.ProcessEvent - 4, // 34: runtime.v1.RuntimeSecurityAgentAPI.GetConfiguration:input_type -> runtime.v1.GetConfigurationRequest - 7, // 35: runtime.v1.RuntimeSecurityAgentAPI.EventsWriteStream:input_type -> runtime.v1.Event - 51, // 36: runtime.v1.RuntimeSecurityAgentAPI.LogsWriteStream:input_type -> runtime.v1.LogEvent - 11, // 37: runtime.v1.RuntimeSecurityAgentAPI.ContainerStatsWriteStream:input_type -> runtime.v1.ContainerStatsBatch - 52, // 38: runtime.v1.RuntimeSecurityAgentAPI.NetflowWriteStream:input_type -> runtime.v1.Netflow - 36, // 39: runtime.v1.RuntimeSecurityAgentAPI.ProcessEventsWriteStream:input_type -> runtime.v1.ProcessTreeEvent - 19, // 40: runtime.v1.RuntimeSecurityAgentAPI.GetSyncState:input_type -> runtime.v1.GetSyncStateRequest - 23, // 41: runtime.v1.RuntimeSecurityAgentAPI.UpdateSyncState:input_type -> runtime.v1.UpdateSyncStateRequest - 14, // 42: runtime.v1.RuntimeSecurityAgentAPI.KubernetesDeltaBatchIngest:input_type -> runtime.v1.KubernetesDeltaBatch - 13, // 43: runtime.v1.RuntimeSecurityAgentAPI.KubernetesDeltaIngest:input_type -> runtime.v1.KubernetesDeltaItem - 17, // 44: runtime.v1.RuntimeSecurityAgentAPI.ImageMetadataIngest:input_type -> runtime.v1.ImageMetadata - 25, // 45: runtime.v1.RuntimeSecurityAgentAPI.KubeBenchReportIngest:input_type -> runtime.v1.KubeBenchReport - 31, // 46: runtime.v1.RuntimeSecurityAgentAPI.KubeLinterReportIngest:input_type -> runtime.v1.KubeLinterReport - 5, // 47: runtime.v1.RuntimeSecurityAgentAPI.GetConfiguration:output_type -> runtime.v1.GetConfigurationResponse - 9, // 48: runtime.v1.RuntimeSecurityAgentAPI.EventsWriteStream:output_type -> runtime.v1.WriteStreamResponse - 9, // 49: runtime.v1.RuntimeSecurityAgentAPI.LogsWriteStream:output_type -> runtime.v1.WriteStreamResponse - 9, // 50: runtime.v1.RuntimeSecurityAgentAPI.ContainerStatsWriteStream:output_type -> runtime.v1.WriteStreamResponse - 9, // 51: runtime.v1.RuntimeSecurityAgentAPI.NetflowWriteStream:output_type -> runtime.v1.WriteStreamResponse - 9, // 52: runtime.v1.RuntimeSecurityAgentAPI.ProcessEventsWriteStream:output_type -> runtime.v1.WriteStreamResponse - 20, // 53: runtime.v1.RuntimeSecurityAgentAPI.GetSyncState:output_type -> runtime.v1.GetSyncStateResponse - 24, // 54: runtime.v1.RuntimeSecurityAgentAPI.UpdateSyncState:output_type -> runtime.v1.UpdateSyncStateResponse - 16, // 55: runtime.v1.RuntimeSecurityAgentAPI.KubernetesDeltaBatchIngest:output_type -> runtime.v1.KubernetesDeltaIngestResponse - 16, // 56: runtime.v1.RuntimeSecurityAgentAPI.KubernetesDeltaIngest:output_type -> runtime.v1.KubernetesDeltaIngestResponse - 18, // 57: runtime.v1.RuntimeSecurityAgentAPI.ImageMetadataIngest:output_type -> runtime.v1.ImageMetadataIngestResponse - 26, // 58: runtime.v1.RuntimeSecurityAgentAPI.KubeBenchReportIngest:output_type -> runtime.v1.KubeBenchReportIngestResponse - 32, // 59: runtime.v1.RuntimeSecurityAgentAPI.KubeLinterReportIngest:output_type -> runtime.v1.KubeLinterReportIngestResponse - 47, // [47:60] is the sub-list for method output_type - 34, // [34:47] is the sub-list for method input_type - 34, // [34:34] is the sub-list for extension type_name - 34, // [34:34] is the sub-list for extension extendee - 0, // [0:34] is the sub-list for field type_name + 43, // 5: runtime.v1.Event.exec:type_name -> runtime.v1.Exec + 44, // 6: runtime.v1.Event.dns:type_name -> runtime.v1.DNS + 45, // 7: runtime.v1.Event.file:type_name -> runtime.v1.File + 46, // 8: runtime.v1.Event.tuple:type_name -> runtime.v1.Tuple + 47, // 9: runtime.v1.Event.signature:type_name -> runtime.v1.SignatureEvent + 48, // 10: runtime.v1.Event.any:type_name -> runtime.v1.Any + 49, // 11: runtime.v1.Event.stdio_via_socket:type_name -> runtime.v1.StdioViaSocketFinding + 50, // 12: runtime.v1.Event.ssh:type_name -> runtime.v1.SSHData + 12, // 13: runtime.v1.StatsBatch.items:type_name -> runtime.v1.StatsItem + 13, // 14: runtime.v1.StatsItem.container:type_name -> runtime.v1.ContainerStats + 14, // 15: runtime.v1.StatsItem.node:type_name -> runtime.v1.NodeStats + 51, // 16: runtime.v1.ContainerStats.cpu_stats:type_name -> runtime.v1.CpuStats + 52, // 17: runtime.v1.ContainerStats.memory_stats:type_name -> runtime.v1.MemoryStats + 53, // 18: runtime.v1.ContainerStats.pids_stats:type_name -> runtime.v1.PidsStats + 54, // 19: runtime.v1.ContainerStats.io_stats:type_name -> runtime.v1.IOStats + 51, // 20: runtime.v1.NodeStats.cpu_stats:type_name -> runtime.v1.CpuStats + 52, // 21: runtime.v1.NodeStats.memory_stats:type_name -> runtime.v1.MemoryStats + 54, // 22: runtime.v1.NodeStats.io_stats:type_name -> runtime.v1.IOStats + 1, // 23: runtime.v1.KubernetesDeltaItem.event:type_name -> runtime.v1.KubernetesDeltaItemEvent + 55, // 24: runtime.v1.KubernetesDeltaItem.object_created_at:type_name -> google.protobuf.Timestamp + 17, // 25: runtime.v1.KubernetesDeltaItem.object_containers:type_name -> runtime.v1.Container + 41, // 26: runtime.v1.KubernetesDeltaItem.object_labels:type_name -> runtime.v1.KubernetesDeltaItem.ObjectLabelsEntry + 42, // 27: runtime.v1.KubernetesDeltaItem.object_annotations:type_name -> runtime.v1.KubernetesDeltaItem.ObjectAnnotationsEntry + 15, // 28: runtime.v1.KubernetesDeltaBatch.items:type_name -> runtime.v1.KubernetesDeltaItem + 55, // 29: runtime.v1.ImageMetadata.created_at:type_name -> google.protobuf.Timestamp + 23, // 30: runtime.v1.GetSyncStateResponse.images:type_name -> runtime.v1.ImagesSyncState + 24, // 31: runtime.v1.ImagesSyncState.images:type_name -> runtime.v1.Image + 2, // 32: runtime.v1.Image.scan_status:type_name -> runtime.v1.ImageScanStatus + 24, // 33: runtime.v1.UpdateSyncStateRequest.images:type_name -> runtime.v1.Image + 30, // 34: runtime.v1.KubeBenchReport.controls:type_name -> runtime.v1.KubeBenchControls + 29, // 35: runtime.v1.KubeBenchReport.node:type_name -> runtime.v1.KubeBenchNode + 31, // 36: runtime.v1.KubeBenchControls.groups:type_name -> runtime.v1.KubeBenchGroup + 32, // 37: runtime.v1.KubeBenchGroup.checks:type_name -> runtime.v1.KubeBenchCheck + 35, // 38: runtime.v1.KubeLinterReport.checks:type_name -> runtime.v1.KubeLinterCheck + 36, // 39: runtime.v1.ProcessEvent.process:type_name -> runtime.v1.Process + 3, // 40: runtime.v1.ProcessEvent.action:type_name -> runtime.v1.ProcessAction + 37, // 41: runtime.v1.ProcessTreeEvent.events:type_name -> runtime.v1.ProcessEvent + 4, // 42: runtime.v1.RuntimeSecurityAgentAPI.GetConfiguration:input_type -> runtime.v1.GetConfigurationRequest + 7, // 43: runtime.v1.RuntimeSecurityAgentAPI.EventsWriteStream:input_type -> runtime.v1.Event + 56, // 44: runtime.v1.RuntimeSecurityAgentAPI.LogsWriteStream:input_type -> runtime.v1.LogEvent + 11, // 45: runtime.v1.RuntimeSecurityAgentAPI.StatsWriteStream:input_type -> runtime.v1.StatsBatch + 57, // 46: runtime.v1.RuntimeSecurityAgentAPI.NetflowWriteStream:input_type -> runtime.v1.Netflow + 38, // 47: runtime.v1.RuntimeSecurityAgentAPI.ProcessEventsWriteStream:input_type -> runtime.v1.ProcessTreeEvent + 21, // 48: runtime.v1.RuntimeSecurityAgentAPI.GetSyncState:input_type -> runtime.v1.GetSyncStateRequest + 25, // 49: runtime.v1.RuntimeSecurityAgentAPI.UpdateSyncState:input_type -> runtime.v1.UpdateSyncStateRequest + 16, // 50: runtime.v1.RuntimeSecurityAgentAPI.KubernetesDeltaBatchIngest:input_type -> runtime.v1.KubernetesDeltaBatch + 15, // 51: runtime.v1.RuntimeSecurityAgentAPI.KubernetesDeltaIngest:input_type -> runtime.v1.KubernetesDeltaItem + 19, // 52: runtime.v1.RuntimeSecurityAgentAPI.ImageMetadataIngest:input_type -> runtime.v1.ImageMetadata + 27, // 53: runtime.v1.RuntimeSecurityAgentAPI.KubeBenchReportIngest:input_type -> runtime.v1.KubeBenchReport + 33, // 54: runtime.v1.RuntimeSecurityAgentAPI.KubeLinterReportIngest:input_type -> runtime.v1.KubeLinterReport + 5, // 55: runtime.v1.RuntimeSecurityAgentAPI.GetConfiguration:output_type -> runtime.v1.GetConfigurationResponse + 9, // 56: runtime.v1.RuntimeSecurityAgentAPI.EventsWriteStream:output_type -> runtime.v1.WriteStreamResponse + 9, // 57: runtime.v1.RuntimeSecurityAgentAPI.LogsWriteStream:output_type -> runtime.v1.WriteStreamResponse + 9, // 58: runtime.v1.RuntimeSecurityAgentAPI.StatsWriteStream:output_type -> runtime.v1.WriteStreamResponse + 9, // 59: runtime.v1.RuntimeSecurityAgentAPI.NetflowWriteStream:output_type -> runtime.v1.WriteStreamResponse + 9, // 60: runtime.v1.RuntimeSecurityAgentAPI.ProcessEventsWriteStream:output_type -> runtime.v1.WriteStreamResponse + 22, // 61: runtime.v1.RuntimeSecurityAgentAPI.GetSyncState:output_type -> runtime.v1.GetSyncStateResponse + 26, // 62: runtime.v1.RuntimeSecurityAgentAPI.UpdateSyncState:output_type -> runtime.v1.UpdateSyncStateResponse + 18, // 63: runtime.v1.RuntimeSecurityAgentAPI.KubernetesDeltaBatchIngest:output_type -> runtime.v1.KubernetesDeltaIngestResponse + 18, // 64: runtime.v1.RuntimeSecurityAgentAPI.KubernetesDeltaIngest:output_type -> runtime.v1.KubernetesDeltaIngestResponse + 20, // 65: runtime.v1.RuntimeSecurityAgentAPI.ImageMetadataIngest:output_type -> runtime.v1.ImageMetadataIngestResponse + 28, // 66: runtime.v1.RuntimeSecurityAgentAPI.KubeBenchReportIngest:output_type -> runtime.v1.KubeBenchReportIngestResponse + 34, // 67: runtime.v1.RuntimeSecurityAgentAPI.KubeLinterReportIngest:output_type -> runtime.v1.KubeLinterReportIngestResponse + 55, // [55:68] is the sub-list for method output_type + 42, // [42:55] is the sub-list for method input_type + 42, // [42:42] is the sub-list for extension type_name + 42, // [42:42] is the sub-list for extension extendee + 0, // [0:42] is the sub-list for field type_name } func init() { file_api_v1_runtime_runtime_agent_api_proto_init() } @@ -3003,6 +3298,428 @@ func file_api_v1_runtime_runtime_agent_api_proto_init() { return } file_api_v1_runtime_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*GetConfigurationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*GetConfigurationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*Configuration); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*ProcessIdentity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*WriteStreamResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[6].Exporter = func(v any, i int) any { + switch v := v.(*SendLogsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[7].Exporter = func(v any, i int) any { + switch v := v.(*StatsBatch); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[8].Exporter = func(v any, i int) any { + switch v := v.(*StatsItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[9].Exporter = func(v any, i int) any { + switch v := v.(*ContainerStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[10].Exporter = func(v any, i int) any { + switch v := v.(*NodeStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[11].Exporter = func(v any, i int) any { + switch v := v.(*KubernetesDeltaItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[12].Exporter = func(v any, i int) any { + switch v := v.(*KubernetesDeltaBatch); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[13].Exporter = func(v any, i int) any { + switch v := v.(*Container); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[14].Exporter = func(v any, i int) any { + switch v := v.(*KubernetesDeltaIngestResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[15].Exporter = func(v any, i int) any { + switch v := v.(*ImageMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[16].Exporter = func(v any, i int) any { + switch v := v.(*ImageMetadataIngestResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[17].Exporter = func(v any, i int) any { + switch v := v.(*GetSyncStateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[18].Exporter = func(v any, i int) any { + switch v := v.(*GetSyncStateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[19].Exporter = func(v any, i int) any { + switch v := v.(*ImagesSyncState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[20].Exporter = func(v any, i int) any { + switch v := v.(*Image); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[21].Exporter = func(v any, i int) any { + switch v := v.(*UpdateSyncStateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[22].Exporter = func(v any, i int) any { + switch v := v.(*UpdateSyncStateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[23].Exporter = func(v any, i int) any { + switch v := v.(*KubeBenchReport); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[24].Exporter = func(v any, i int) any { + switch v := v.(*KubeBenchReportIngestResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[25].Exporter = func(v any, i int) any { + switch v := v.(*KubeBenchNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[26].Exporter = func(v any, i int) any { + switch v := v.(*KubeBenchControls); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[27].Exporter = func(v any, i int) any { + switch v := v.(*KubeBenchGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[28].Exporter = func(v any, i int) any { + switch v := v.(*KubeBenchCheck); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[29].Exporter = func(v any, i int) any { + switch v := v.(*KubeLinterReport); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[30].Exporter = func(v any, i int) any { + switch v := v.(*KubeLinterReportIngestResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[31].Exporter = func(v any, i int) any { + switch v := v.(*KubeLinterCheck); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[32].Exporter = func(v any, i int) any { + switch v := v.(*Process); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[33].Exporter = func(v any, i int) any { + switch v := v.(*ProcessEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[34].Exporter = func(v any, i int) any { + switch v := v.(*ProcessTreeEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } file_api_v1_runtime_runtime_agent_api_proto_msgTypes[0].OneofWrappers = []any{ (*GetConfigurationRequest_Controller)(nil), (*GetConfigurationRequest_Agent)(nil), @@ -3017,13 +3734,17 @@ func file_api_v1_runtime_runtime_agent_api_proto_init() { (*Event_StdioViaSocket)(nil), (*Event_Ssh)(nil), } + file_api_v1_runtime_runtime_agent_api_proto_msgTypes[8].OneofWrappers = []any{ + (*StatsItem_Container)(nil), + (*StatsItem_Node)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_runtime_runtime_agent_api_proto_rawDesc, NumEnums: 4, - NumMessages: 37, + NumMessages: 39, NumExtensions: 0, NumServices: 1, }, diff --git a/api/v1/runtime/runtime_agent_api.proto b/api/v1/runtime/runtime_agent_api.proto index fbecfed6..6c2d01a5 100644 --- a/api/v1/runtime/runtime_agent_api.proto +++ b/api/v1/runtime/runtime_agent_api.proto @@ -12,7 +12,7 @@ service RuntimeSecurityAgentAPI { rpc GetConfiguration(GetConfigurationRequest) returns (GetConfigurationResponse) {} rpc EventsWriteStream(stream Event) returns (WriteStreamResponse) {} rpc LogsWriteStream(stream LogEvent) returns (WriteStreamResponse) {} - rpc ContainerStatsWriteStream(stream ContainerStatsBatch) returns (WriteStreamResponse) {} + rpc StatsWriteStream(stream StatsBatch) returns (WriteStreamResponse) {} rpc NetflowWriteStream(stream Netflow) returns (WriteStreamResponse) {} rpc ProcessEventsWriteStream(stream ProcessTreeEvent) returns (WriteStreamResponse) {} @@ -99,8 +99,15 @@ message WriteStreamResponse {} message SendLogsResponse {} -message ContainerStatsBatch { - repeated ContainerStats items = 1; +message StatsBatch { + repeated StatsItem items = 1; +} + +message StatsItem { + oneof data { + ContainerStats container = 1; + NodeStats node = 2; + } } message ContainerStats { @@ -111,7 +118,19 @@ message ContainerStats { string workload_kind = 7; string pod_uid = 5; string container_id = 6; - repeated v1.Stats stats = 21; + string node_name = 8; + + CpuStats cpu_stats = 21; + MemoryStats memory_stats = 22; + PidsStats pids_stats = 23; + IOStats io_stats = 24; +} + +message NodeStats { + string node_name = 1; + CpuStats cpu_stats = 21; + MemoryStats memory_stats = 22; + IOStats io_stats = 23; } enum KubernetesDeltaItemEvent { diff --git a/api/v1/runtime/runtime_agent_api_grpc.pb.go b/api/v1/runtime/runtime_agent_api_grpc.pb.go index ba731367..cbcd677b 100644 --- a/api/v1/runtime/runtime_agent_api_grpc.pb.go +++ b/api/v1/runtime/runtime_agent_api_grpc.pb.go @@ -1,8 +1,4 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.0 -// source: api/v1/runtime/runtime_agent_api.proto package v1 @@ -15,42 +11,24 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.64.0 or later. -const _ = grpc.SupportPackageIsVersion9 - -const ( - RuntimeSecurityAgentAPI_GetConfiguration_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/GetConfiguration" - RuntimeSecurityAgentAPI_EventsWriteStream_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/EventsWriteStream" - RuntimeSecurityAgentAPI_LogsWriteStream_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/LogsWriteStream" - RuntimeSecurityAgentAPI_ContainerStatsWriteStream_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/ContainerStatsWriteStream" - RuntimeSecurityAgentAPI_NetflowWriteStream_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/NetflowWriteStream" - RuntimeSecurityAgentAPI_ProcessEventsWriteStream_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/ProcessEventsWriteStream" - RuntimeSecurityAgentAPI_GetSyncState_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/GetSyncState" - RuntimeSecurityAgentAPI_UpdateSyncState_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/UpdateSyncState" - RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngest_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/KubernetesDeltaBatchIngest" - RuntimeSecurityAgentAPI_KubernetesDeltaIngest_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/KubernetesDeltaIngest" - RuntimeSecurityAgentAPI_ImageMetadataIngest_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/ImageMetadataIngest" - RuntimeSecurityAgentAPI_KubeBenchReportIngest_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/KubeBenchReportIngest" - RuntimeSecurityAgentAPI_KubeLinterReportIngest_FullMethodName = "/runtime.v1.RuntimeSecurityAgentAPI/KubeLinterReportIngest" -) +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 // RuntimeSecurityAgentAPIClient is the client API for RuntimeSecurityAgentAPI service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -// -// RuntimeSecurityAgentAPI is used in kvisord. Should be mirrored. type RuntimeSecurityAgentAPIClient interface { GetConfiguration(ctx context.Context, in *GetConfigurationRequest, opts ...grpc.CallOption) (*GetConfigurationResponse, error) - EventsWriteStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[Event, WriteStreamResponse], error) - LogsWriteStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[LogEvent, WriteStreamResponse], error) - ContainerStatsWriteStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[ContainerStatsBatch, WriteStreamResponse], error) - NetflowWriteStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[Netflow, WriteStreamResponse], error) - ProcessEventsWriteStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[ProcessTreeEvent, WriteStreamResponse], error) + EventsWriteStream(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_EventsWriteStreamClient, error) + LogsWriteStream(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_LogsWriteStreamClient, error) + StatsWriteStream(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_StatsWriteStreamClient, error) + NetflowWriteStream(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_NetflowWriteStreamClient, error) + ProcessEventsWriteStream(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_ProcessEventsWriteStreamClient, error) GetSyncState(ctx context.Context, in *GetSyncStateRequest, opts ...grpc.CallOption) (*GetSyncStateResponse, error) UpdateSyncState(ctx context.Context, in *UpdateSyncStateRequest, opts ...grpc.CallOption) (*UpdateSyncStateResponse, error) - KubernetesDeltaBatchIngest(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[KubernetesDeltaBatch, KubernetesDeltaIngestResponse], error) + KubernetesDeltaBatchIngest(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngestClient, error) // Deprecated. Should use KubernetesDeltaBatchIngest. - KubernetesDeltaIngest(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[KubernetesDeltaItem, KubernetesDeltaIngestResponse], error) + KubernetesDeltaIngest(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_KubernetesDeltaIngestClient, error) ImageMetadataIngest(ctx context.Context, in *ImageMetadata, opts ...grpc.CallOption) (*ImageMetadataIngestResponse, error) KubeBenchReportIngest(ctx context.Context, in *KubeBenchReport, opts ...grpc.CallOption) (*KubeBenchReportIngestResponse, error) KubeLinterReportIngest(ctx context.Context, in *KubeLinterReport, opts ...grpc.CallOption) (*KubeLinterReportIngestResponse, error) @@ -65,84 +43,187 @@ func NewRuntimeSecurityAgentAPIClient(cc grpc.ClientConnInterface) RuntimeSecuri } func (c *runtimeSecurityAgentAPIClient) GetConfiguration(ctx context.Context, in *GetConfigurationRequest, opts ...grpc.CallOption) (*GetConfigurationResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetConfigurationResponse) - err := c.cc.Invoke(ctx, RuntimeSecurityAgentAPI_GetConfiguration_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, "/runtime.v1.RuntimeSecurityAgentAPI/GetConfiguration", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *runtimeSecurityAgentAPIClient) EventsWriteStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[Event, WriteStreamResponse], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[0], RuntimeSecurityAgentAPI_EventsWriteStream_FullMethodName, cOpts...) +func (c *runtimeSecurityAgentAPIClient) EventsWriteStream(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_EventsWriteStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[0], "/runtime.v1.RuntimeSecurityAgentAPI/EventsWriteStream", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[Event, WriteStreamResponse]{ClientStream: stream} + x := &runtimeSecurityAgentAPIEventsWriteStreamClient{stream} return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_EventsWriteStreamClient = grpc.ClientStreamingClient[Event, WriteStreamResponse] +type RuntimeSecurityAgentAPI_EventsWriteStreamClient interface { + Send(*Event) error + CloseAndRecv() (*WriteStreamResponse, error) + grpc.ClientStream +} + +type runtimeSecurityAgentAPIEventsWriteStreamClient struct { + grpc.ClientStream +} + +func (x *runtimeSecurityAgentAPIEventsWriteStreamClient) Send(m *Event) error { + return x.ClientStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPIEventsWriteStreamClient) CloseAndRecv() (*WriteStreamResponse, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(WriteStreamResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} -func (c *runtimeSecurityAgentAPIClient) LogsWriteStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[LogEvent, WriteStreamResponse], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[1], RuntimeSecurityAgentAPI_LogsWriteStream_FullMethodName, cOpts...) +func (c *runtimeSecurityAgentAPIClient) LogsWriteStream(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_LogsWriteStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[1], "/runtime.v1.RuntimeSecurityAgentAPI/LogsWriteStream", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[LogEvent, WriteStreamResponse]{ClientStream: stream} + x := &runtimeSecurityAgentAPILogsWriteStreamClient{stream} return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_LogsWriteStreamClient = grpc.ClientStreamingClient[LogEvent, WriteStreamResponse] +type RuntimeSecurityAgentAPI_LogsWriteStreamClient interface { + Send(*LogEvent) error + CloseAndRecv() (*WriteStreamResponse, error) + grpc.ClientStream +} + +type runtimeSecurityAgentAPILogsWriteStreamClient struct { + grpc.ClientStream +} + +func (x *runtimeSecurityAgentAPILogsWriteStreamClient) Send(m *LogEvent) error { + return x.ClientStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPILogsWriteStreamClient) CloseAndRecv() (*WriteStreamResponse, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(WriteStreamResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} -func (c *runtimeSecurityAgentAPIClient) ContainerStatsWriteStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[ContainerStatsBatch, WriteStreamResponse], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[2], RuntimeSecurityAgentAPI_ContainerStatsWriteStream_FullMethodName, cOpts...) +func (c *runtimeSecurityAgentAPIClient) StatsWriteStream(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_StatsWriteStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[2], "/runtime.v1.RuntimeSecurityAgentAPI/StatsWriteStream", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[ContainerStatsBatch, WriteStreamResponse]{ClientStream: stream} + x := &runtimeSecurityAgentAPIStatsWriteStreamClient{stream} return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_ContainerStatsWriteStreamClient = grpc.ClientStreamingClient[ContainerStatsBatch, WriteStreamResponse] +type RuntimeSecurityAgentAPI_StatsWriteStreamClient interface { + Send(*StatsBatch) error + CloseAndRecv() (*WriteStreamResponse, error) + grpc.ClientStream +} + +type runtimeSecurityAgentAPIStatsWriteStreamClient struct { + grpc.ClientStream +} + +func (x *runtimeSecurityAgentAPIStatsWriteStreamClient) Send(m *StatsBatch) error { + return x.ClientStream.SendMsg(m) +} -func (c *runtimeSecurityAgentAPIClient) NetflowWriteStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[Netflow, WriteStreamResponse], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[3], RuntimeSecurityAgentAPI_NetflowWriteStream_FullMethodName, cOpts...) +func (x *runtimeSecurityAgentAPIStatsWriteStreamClient) CloseAndRecv() (*WriteStreamResponse, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(WriteStreamResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *runtimeSecurityAgentAPIClient) NetflowWriteStream(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_NetflowWriteStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[3], "/runtime.v1.RuntimeSecurityAgentAPI/NetflowWriteStream", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[Netflow, WriteStreamResponse]{ClientStream: stream} + x := &runtimeSecurityAgentAPINetflowWriteStreamClient{stream} return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_NetflowWriteStreamClient = grpc.ClientStreamingClient[Netflow, WriteStreamResponse] +type RuntimeSecurityAgentAPI_NetflowWriteStreamClient interface { + Send(*Netflow) error + CloseAndRecv() (*WriteStreamResponse, error) + grpc.ClientStream +} -func (c *runtimeSecurityAgentAPIClient) ProcessEventsWriteStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[ProcessTreeEvent, WriteStreamResponse], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[4], RuntimeSecurityAgentAPI_ProcessEventsWriteStream_FullMethodName, cOpts...) +type runtimeSecurityAgentAPINetflowWriteStreamClient struct { + grpc.ClientStream +} + +func (x *runtimeSecurityAgentAPINetflowWriteStreamClient) Send(m *Netflow) error { + return x.ClientStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPINetflowWriteStreamClient) CloseAndRecv() (*WriteStreamResponse, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(WriteStreamResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *runtimeSecurityAgentAPIClient) ProcessEventsWriteStream(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_ProcessEventsWriteStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[4], "/runtime.v1.RuntimeSecurityAgentAPI/ProcessEventsWriteStream", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[ProcessTreeEvent, WriteStreamResponse]{ClientStream: stream} + x := &runtimeSecurityAgentAPIProcessEventsWriteStreamClient{stream} return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_ProcessEventsWriteStreamClient = grpc.ClientStreamingClient[ProcessTreeEvent, WriteStreamResponse] +type RuntimeSecurityAgentAPI_ProcessEventsWriteStreamClient interface { + Send(*ProcessTreeEvent) error + CloseAndRecv() (*WriteStreamResponse, error) + grpc.ClientStream +} + +type runtimeSecurityAgentAPIProcessEventsWriteStreamClient struct { + grpc.ClientStream +} + +func (x *runtimeSecurityAgentAPIProcessEventsWriteStreamClient) Send(m *ProcessTreeEvent) error { + return x.ClientStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPIProcessEventsWriteStreamClient) CloseAndRecv() (*WriteStreamResponse, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(WriteStreamResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func (c *runtimeSecurityAgentAPIClient) GetSyncState(ctx context.Context, in *GetSyncStateRequest, opts ...grpc.CallOption) (*GetSyncStateResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetSyncStateResponse) - err := c.cc.Invoke(ctx, RuntimeSecurityAgentAPI_GetSyncState_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, "/runtime.v1.RuntimeSecurityAgentAPI/GetSyncState", in, out, opts...) if err != nil { return nil, err } @@ -150,45 +231,79 @@ func (c *runtimeSecurityAgentAPIClient) GetSyncState(ctx context.Context, in *Ge } func (c *runtimeSecurityAgentAPIClient) UpdateSyncState(ctx context.Context, in *UpdateSyncStateRequest, opts ...grpc.CallOption) (*UpdateSyncStateResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(UpdateSyncStateResponse) - err := c.cc.Invoke(ctx, RuntimeSecurityAgentAPI_UpdateSyncState_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, "/runtime.v1.RuntimeSecurityAgentAPI/UpdateSyncState", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *runtimeSecurityAgentAPIClient) KubernetesDeltaBatchIngest(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[KubernetesDeltaBatch, KubernetesDeltaIngestResponse], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[5], RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngest_FullMethodName, cOpts...) +func (c *runtimeSecurityAgentAPIClient) KubernetesDeltaBatchIngest(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngestClient, error) { + stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[5], "/runtime.v1.RuntimeSecurityAgentAPI/KubernetesDeltaBatchIngest", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[KubernetesDeltaBatch, KubernetesDeltaIngestResponse]{ClientStream: stream} + x := &runtimeSecurityAgentAPIKubernetesDeltaBatchIngestClient{stream} return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngestClient = grpc.BidiStreamingClient[KubernetesDeltaBatch, KubernetesDeltaIngestResponse] +type RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngestClient interface { + Send(*KubernetesDeltaBatch) error + Recv() (*KubernetesDeltaIngestResponse, error) + grpc.ClientStream +} -func (c *runtimeSecurityAgentAPIClient) KubernetesDeltaIngest(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[KubernetesDeltaItem, KubernetesDeltaIngestResponse], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[6], RuntimeSecurityAgentAPI_KubernetesDeltaIngest_FullMethodName, cOpts...) +type runtimeSecurityAgentAPIKubernetesDeltaBatchIngestClient struct { + grpc.ClientStream +} + +func (x *runtimeSecurityAgentAPIKubernetesDeltaBatchIngestClient) Send(m *KubernetesDeltaBatch) error { + return x.ClientStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPIKubernetesDeltaBatchIngestClient) Recv() (*KubernetesDeltaIngestResponse, error) { + m := new(KubernetesDeltaIngestResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *runtimeSecurityAgentAPIClient) KubernetesDeltaIngest(ctx context.Context, opts ...grpc.CallOption) (RuntimeSecurityAgentAPI_KubernetesDeltaIngestClient, error) { + stream, err := c.cc.NewStream(ctx, &RuntimeSecurityAgentAPI_ServiceDesc.Streams[6], "/runtime.v1.RuntimeSecurityAgentAPI/KubernetesDeltaIngest", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[KubernetesDeltaItem, KubernetesDeltaIngestResponse]{ClientStream: stream} + x := &runtimeSecurityAgentAPIKubernetesDeltaIngestClient{stream} return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_KubernetesDeltaIngestClient = grpc.BidiStreamingClient[KubernetesDeltaItem, KubernetesDeltaIngestResponse] +type RuntimeSecurityAgentAPI_KubernetesDeltaIngestClient interface { + Send(*KubernetesDeltaItem) error + Recv() (*KubernetesDeltaIngestResponse, error) + grpc.ClientStream +} + +type runtimeSecurityAgentAPIKubernetesDeltaIngestClient struct { + grpc.ClientStream +} + +func (x *runtimeSecurityAgentAPIKubernetesDeltaIngestClient) Send(m *KubernetesDeltaItem) error { + return x.ClientStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPIKubernetesDeltaIngestClient) Recv() (*KubernetesDeltaIngestResponse, error) { + m := new(KubernetesDeltaIngestResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func (c *runtimeSecurityAgentAPIClient) ImageMetadataIngest(ctx context.Context, in *ImageMetadata, opts ...grpc.CallOption) (*ImageMetadataIngestResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ImageMetadataIngestResponse) - err := c.cc.Invoke(ctx, RuntimeSecurityAgentAPI_ImageMetadataIngest_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, "/runtime.v1.RuntimeSecurityAgentAPI/ImageMetadataIngest", in, out, opts...) if err != nil { return nil, err } @@ -196,9 +311,8 @@ func (c *runtimeSecurityAgentAPIClient) ImageMetadataIngest(ctx context.Context, } func (c *runtimeSecurityAgentAPIClient) KubeBenchReportIngest(ctx context.Context, in *KubeBenchReport, opts ...grpc.CallOption) (*KubeBenchReportIngestResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(KubeBenchReportIngestResponse) - err := c.cc.Invoke(ctx, RuntimeSecurityAgentAPI_KubeBenchReportIngest_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, "/runtime.v1.RuntimeSecurityAgentAPI/KubeBenchReportIngest", in, out, opts...) if err != nil { return nil, err } @@ -206,9 +320,8 @@ func (c *runtimeSecurityAgentAPIClient) KubeBenchReportIngest(ctx context.Contex } func (c *runtimeSecurityAgentAPIClient) KubeLinterReportIngest(ctx context.Context, in *KubeLinterReport, opts ...grpc.CallOption) (*KubeLinterReportIngestResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(KubeLinterReportIngestResponse) - err := c.cc.Invoke(ctx, RuntimeSecurityAgentAPI_KubeLinterReportIngest_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, "/runtime.v1.RuntimeSecurityAgentAPI/KubeLinterReportIngest", in, out, opts...) if err != nil { return nil, err } @@ -217,49 +330,44 @@ func (c *runtimeSecurityAgentAPIClient) KubeLinterReportIngest(ctx context.Conte // RuntimeSecurityAgentAPIServer is the server API for RuntimeSecurityAgentAPI service. // All implementations should embed UnimplementedRuntimeSecurityAgentAPIServer -// for forward compatibility. -// -// RuntimeSecurityAgentAPI is used in kvisord. Should be mirrored. +// for forward compatibility type RuntimeSecurityAgentAPIServer interface { GetConfiguration(context.Context, *GetConfigurationRequest) (*GetConfigurationResponse, error) - EventsWriteStream(grpc.ClientStreamingServer[Event, WriteStreamResponse]) error - LogsWriteStream(grpc.ClientStreamingServer[LogEvent, WriteStreamResponse]) error - ContainerStatsWriteStream(grpc.ClientStreamingServer[ContainerStatsBatch, WriteStreamResponse]) error - NetflowWriteStream(grpc.ClientStreamingServer[Netflow, WriteStreamResponse]) error - ProcessEventsWriteStream(grpc.ClientStreamingServer[ProcessTreeEvent, WriteStreamResponse]) error + EventsWriteStream(RuntimeSecurityAgentAPI_EventsWriteStreamServer) error + LogsWriteStream(RuntimeSecurityAgentAPI_LogsWriteStreamServer) error + StatsWriteStream(RuntimeSecurityAgentAPI_StatsWriteStreamServer) error + NetflowWriteStream(RuntimeSecurityAgentAPI_NetflowWriteStreamServer) error + ProcessEventsWriteStream(RuntimeSecurityAgentAPI_ProcessEventsWriteStreamServer) error GetSyncState(context.Context, *GetSyncStateRequest) (*GetSyncStateResponse, error) UpdateSyncState(context.Context, *UpdateSyncStateRequest) (*UpdateSyncStateResponse, error) - KubernetesDeltaBatchIngest(grpc.BidiStreamingServer[KubernetesDeltaBatch, KubernetesDeltaIngestResponse]) error + KubernetesDeltaBatchIngest(RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngestServer) error // Deprecated. Should use KubernetesDeltaBatchIngest. - KubernetesDeltaIngest(grpc.BidiStreamingServer[KubernetesDeltaItem, KubernetesDeltaIngestResponse]) error + KubernetesDeltaIngest(RuntimeSecurityAgentAPI_KubernetesDeltaIngestServer) error ImageMetadataIngest(context.Context, *ImageMetadata) (*ImageMetadataIngestResponse, error) KubeBenchReportIngest(context.Context, *KubeBenchReport) (*KubeBenchReportIngestResponse, error) KubeLinterReportIngest(context.Context, *KubeLinterReport) (*KubeLinterReportIngestResponse, error) } -// UnimplementedRuntimeSecurityAgentAPIServer should be embedded to have -// forward compatible implementations. -// -// NOTE: this should be embedded by value instead of pointer to avoid a nil -// pointer dereference when methods are called. -type UnimplementedRuntimeSecurityAgentAPIServer struct{} +// UnimplementedRuntimeSecurityAgentAPIServer should be embedded to have forward compatible implementations. +type UnimplementedRuntimeSecurityAgentAPIServer struct { +} func (UnimplementedRuntimeSecurityAgentAPIServer) GetConfiguration(context.Context, *GetConfigurationRequest) (*GetConfigurationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetConfiguration not implemented") } -func (UnimplementedRuntimeSecurityAgentAPIServer) EventsWriteStream(grpc.ClientStreamingServer[Event, WriteStreamResponse]) error { +func (UnimplementedRuntimeSecurityAgentAPIServer) EventsWriteStream(RuntimeSecurityAgentAPI_EventsWriteStreamServer) error { return status.Errorf(codes.Unimplemented, "method EventsWriteStream not implemented") } -func (UnimplementedRuntimeSecurityAgentAPIServer) LogsWriteStream(grpc.ClientStreamingServer[LogEvent, WriteStreamResponse]) error { +func (UnimplementedRuntimeSecurityAgentAPIServer) LogsWriteStream(RuntimeSecurityAgentAPI_LogsWriteStreamServer) error { return status.Errorf(codes.Unimplemented, "method LogsWriteStream not implemented") } -func (UnimplementedRuntimeSecurityAgentAPIServer) ContainerStatsWriteStream(grpc.ClientStreamingServer[ContainerStatsBatch, WriteStreamResponse]) error { - return status.Errorf(codes.Unimplemented, "method ContainerStatsWriteStream not implemented") +func (UnimplementedRuntimeSecurityAgentAPIServer) StatsWriteStream(RuntimeSecurityAgentAPI_StatsWriteStreamServer) error { + return status.Errorf(codes.Unimplemented, "method StatsWriteStream not implemented") } -func (UnimplementedRuntimeSecurityAgentAPIServer) NetflowWriteStream(grpc.ClientStreamingServer[Netflow, WriteStreamResponse]) error { +func (UnimplementedRuntimeSecurityAgentAPIServer) NetflowWriteStream(RuntimeSecurityAgentAPI_NetflowWriteStreamServer) error { return status.Errorf(codes.Unimplemented, "method NetflowWriteStream not implemented") } -func (UnimplementedRuntimeSecurityAgentAPIServer) ProcessEventsWriteStream(grpc.ClientStreamingServer[ProcessTreeEvent, WriteStreamResponse]) error { +func (UnimplementedRuntimeSecurityAgentAPIServer) ProcessEventsWriteStream(RuntimeSecurityAgentAPI_ProcessEventsWriteStreamServer) error { return status.Errorf(codes.Unimplemented, "method ProcessEventsWriteStream not implemented") } func (UnimplementedRuntimeSecurityAgentAPIServer) GetSyncState(context.Context, *GetSyncStateRequest) (*GetSyncStateResponse, error) { @@ -268,10 +376,10 @@ func (UnimplementedRuntimeSecurityAgentAPIServer) GetSyncState(context.Context, func (UnimplementedRuntimeSecurityAgentAPIServer) UpdateSyncState(context.Context, *UpdateSyncStateRequest) (*UpdateSyncStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateSyncState not implemented") } -func (UnimplementedRuntimeSecurityAgentAPIServer) KubernetesDeltaBatchIngest(grpc.BidiStreamingServer[KubernetesDeltaBatch, KubernetesDeltaIngestResponse]) error { +func (UnimplementedRuntimeSecurityAgentAPIServer) KubernetesDeltaBatchIngest(RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngestServer) error { return status.Errorf(codes.Unimplemented, "method KubernetesDeltaBatchIngest not implemented") } -func (UnimplementedRuntimeSecurityAgentAPIServer) KubernetesDeltaIngest(grpc.BidiStreamingServer[KubernetesDeltaItem, KubernetesDeltaIngestResponse]) error { +func (UnimplementedRuntimeSecurityAgentAPIServer) KubernetesDeltaIngest(RuntimeSecurityAgentAPI_KubernetesDeltaIngestServer) error { return status.Errorf(codes.Unimplemented, "method KubernetesDeltaIngest not implemented") } func (UnimplementedRuntimeSecurityAgentAPIServer) ImageMetadataIngest(context.Context, *ImageMetadata) (*ImageMetadataIngestResponse, error) { @@ -283,7 +391,6 @@ func (UnimplementedRuntimeSecurityAgentAPIServer) KubeBenchReportIngest(context. func (UnimplementedRuntimeSecurityAgentAPIServer) KubeLinterReportIngest(context.Context, *KubeLinterReport) (*KubeLinterReportIngestResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method KubeLinterReportIngest not implemented") } -func (UnimplementedRuntimeSecurityAgentAPIServer) testEmbeddedByValue() {} // UnsafeRuntimeSecurityAgentAPIServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to RuntimeSecurityAgentAPIServer will @@ -293,13 +400,6 @@ type UnsafeRuntimeSecurityAgentAPIServer interface { } func RegisterRuntimeSecurityAgentAPIServer(s grpc.ServiceRegistrar, srv RuntimeSecurityAgentAPIServer) { - // If the following call pancis, it indicates UnimplementedRuntimeSecurityAgentAPIServer was - // embedded by pointer and is nil. This will cause panics if an - // unimplemented method is ever invoked, so we test this at initialization - // time to prevent it from happening at runtime later due to I/O. - if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { - t.testEmbeddedByValue() - } s.RegisterService(&RuntimeSecurityAgentAPI_ServiceDesc, srv) } @@ -313,7 +413,7 @@ func _RuntimeSecurityAgentAPI_GetConfiguration_Handler(srv interface{}, ctx cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RuntimeSecurityAgentAPI_GetConfiguration_FullMethodName, + FullMethod: "/runtime.v1.RuntimeSecurityAgentAPI/GetConfiguration", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RuntimeSecurityAgentAPIServer).GetConfiguration(ctx, req.(*GetConfigurationRequest)) @@ -322,39 +422,134 @@ func _RuntimeSecurityAgentAPI_GetConfiguration_Handler(srv interface{}, ctx cont } func _RuntimeSecurityAgentAPI_EventsWriteStream_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(RuntimeSecurityAgentAPIServer).EventsWriteStream(&grpc.GenericServerStream[Event, WriteStreamResponse]{ServerStream: stream}) + return srv.(RuntimeSecurityAgentAPIServer).EventsWriteStream(&runtimeSecurityAgentAPIEventsWriteStreamServer{stream}) +} + +type RuntimeSecurityAgentAPI_EventsWriteStreamServer interface { + SendAndClose(*WriteStreamResponse) error + Recv() (*Event, error) + grpc.ServerStream } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_EventsWriteStreamServer = grpc.ClientStreamingServer[Event, WriteStreamResponse] +type runtimeSecurityAgentAPIEventsWriteStreamServer struct { + grpc.ServerStream +} + +func (x *runtimeSecurityAgentAPIEventsWriteStreamServer) SendAndClose(m *WriteStreamResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPIEventsWriteStreamServer) Recv() (*Event, error) { + m := new(Event) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func _RuntimeSecurityAgentAPI_LogsWriteStream_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(RuntimeSecurityAgentAPIServer).LogsWriteStream(&grpc.GenericServerStream[LogEvent, WriteStreamResponse]{ServerStream: stream}) + return srv.(RuntimeSecurityAgentAPIServer).LogsWriteStream(&runtimeSecurityAgentAPILogsWriteStreamServer{stream}) +} + +type RuntimeSecurityAgentAPI_LogsWriteStreamServer interface { + SendAndClose(*WriteStreamResponse) error + Recv() (*LogEvent, error) + grpc.ServerStream +} + +type runtimeSecurityAgentAPILogsWriteStreamServer struct { + grpc.ServerStream +} + +func (x *runtimeSecurityAgentAPILogsWriteStreamServer) SendAndClose(m *WriteStreamResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPILogsWriteStreamServer) Recv() (*LogEvent, error) { + m := new(LogEvent) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_LogsWriteStreamServer = grpc.ClientStreamingServer[LogEvent, WriteStreamResponse] +func _RuntimeSecurityAgentAPI_StatsWriteStream_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(RuntimeSecurityAgentAPIServer).StatsWriteStream(&runtimeSecurityAgentAPIStatsWriteStreamServer{stream}) +} -func _RuntimeSecurityAgentAPI_ContainerStatsWriteStream_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(RuntimeSecurityAgentAPIServer).ContainerStatsWriteStream(&grpc.GenericServerStream[ContainerStatsBatch, WriteStreamResponse]{ServerStream: stream}) +type RuntimeSecurityAgentAPI_StatsWriteStreamServer interface { + SendAndClose(*WriteStreamResponse) error + Recv() (*StatsBatch, error) + grpc.ServerStream } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_ContainerStatsWriteStreamServer = grpc.ClientStreamingServer[ContainerStatsBatch, WriteStreamResponse] +type runtimeSecurityAgentAPIStatsWriteStreamServer struct { + grpc.ServerStream +} + +func (x *runtimeSecurityAgentAPIStatsWriteStreamServer) SendAndClose(m *WriteStreamResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPIStatsWriteStreamServer) Recv() (*StatsBatch, error) { + m := new(StatsBatch) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func _RuntimeSecurityAgentAPI_NetflowWriteStream_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(RuntimeSecurityAgentAPIServer).NetflowWriteStream(&grpc.GenericServerStream[Netflow, WriteStreamResponse]{ServerStream: stream}) + return srv.(RuntimeSecurityAgentAPIServer).NetflowWriteStream(&runtimeSecurityAgentAPINetflowWriteStreamServer{stream}) } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_NetflowWriteStreamServer = grpc.ClientStreamingServer[Netflow, WriteStreamResponse] +type RuntimeSecurityAgentAPI_NetflowWriteStreamServer interface { + SendAndClose(*WriteStreamResponse) error + Recv() (*Netflow, error) + grpc.ServerStream +} + +type runtimeSecurityAgentAPINetflowWriteStreamServer struct { + grpc.ServerStream +} + +func (x *runtimeSecurityAgentAPINetflowWriteStreamServer) SendAndClose(m *WriteStreamResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPINetflowWriteStreamServer) Recv() (*Netflow, error) { + m := new(Netflow) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func _RuntimeSecurityAgentAPI_ProcessEventsWriteStream_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(RuntimeSecurityAgentAPIServer).ProcessEventsWriteStream(&grpc.GenericServerStream[ProcessTreeEvent, WriteStreamResponse]{ServerStream: stream}) + return srv.(RuntimeSecurityAgentAPIServer).ProcessEventsWriteStream(&runtimeSecurityAgentAPIProcessEventsWriteStreamServer{stream}) +} + +type RuntimeSecurityAgentAPI_ProcessEventsWriteStreamServer interface { + SendAndClose(*WriteStreamResponse) error + Recv() (*ProcessTreeEvent, error) + grpc.ServerStream } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_ProcessEventsWriteStreamServer = grpc.ClientStreamingServer[ProcessTreeEvent, WriteStreamResponse] +type runtimeSecurityAgentAPIProcessEventsWriteStreamServer struct { + grpc.ServerStream +} + +func (x *runtimeSecurityAgentAPIProcessEventsWriteStreamServer) SendAndClose(m *WriteStreamResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPIProcessEventsWriteStreamServer) Recv() (*ProcessTreeEvent, error) { + m := new(ProcessTreeEvent) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func _RuntimeSecurityAgentAPI_GetSyncState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetSyncStateRequest) @@ -366,7 +561,7 @@ func _RuntimeSecurityAgentAPI_GetSyncState_Handler(srv interface{}, ctx context. } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RuntimeSecurityAgentAPI_GetSyncState_FullMethodName, + FullMethod: "/runtime.v1.RuntimeSecurityAgentAPI/GetSyncState", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RuntimeSecurityAgentAPIServer).GetSyncState(ctx, req.(*GetSyncStateRequest)) @@ -384,7 +579,7 @@ func _RuntimeSecurityAgentAPI_UpdateSyncState_Handler(srv interface{}, ctx conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RuntimeSecurityAgentAPI_UpdateSyncState_FullMethodName, + FullMethod: "/runtime.v1.RuntimeSecurityAgentAPI/UpdateSyncState", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RuntimeSecurityAgentAPIServer).UpdateSyncState(ctx, req.(*UpdateSyncStateRequest)) @@ -393,18 +588,56 @@ func _RuntimeSecurityAgentAPI_UpdateSyncState_Handler(srv interface{}, ctx conte } func _RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngest_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(RuntimeSecurityAgentAPIServer).KubernetesDeltaBatchIngest(&grpc.GenericServerStream[KubernetesDeltaBatch, KubernetesDeltaIngestResponse]{ServerStream: stream}) + return srv.(RuntimeSecurityAgentAPIServer).KubernetesDeltaBatchIngest(&runtimeSecurityAgentAPIKubernetesDeltaBatchIngestServer{stream}) } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngestServer = grpc.BidiStreamingServer[KubernetesDeltaBatch, KubernetesDeltaIngestResponse] +type RuntimeSecurityAgentAPI_KubernetesDeltaBatchIngestServer interface { + Send(*KubernetesDeltaIngestResponse) error + Recv() (*KubernetesDeltaBatch, error) + grpc.ServerStream +} + +type runtimeSecurityAgentAPIKubernetesDeltaBatchIngestServer struct { + grpc.ServerStream +} + +func (x *runtimeSecurityAgentAPIKubernetesDeltaBatchIngestServer) Send(m *KubernetesDeltaIngestResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPIKubernetesDeltaBatchIngestServer) Recv() (*KubernetesDeltaBatch, error) { + m := new(KubernetesDeltaBatch) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func _RuntimeSecurityAgentAPI_KubernetesDeltaIngest_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(RuntimeSecurityAgentAPIServer).KubernetesDeltaIngest(&grpc.GenericServerStream[KubernetesDeltaItem, KubernetesDeltaIngestResponse]{ServerStream: stream}) + return srv.(RuntimeSecurityAgentAPIServer).KubernetesDeltaIngest(&runtimeSecurityAgentAPIKubernetesDeltaIngestServer{stream}) } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type RuntimeSecurityAgentAPI_KubernetesDeltaIngestServer = grpc.BidiStreamingServer[KubernetesDeltaItem, KubernetesDeltaIngestResponse] +type RuntimeSecurityAgentAPI_KubernetesDeltaIngestServer interface { + Send(*KubernetesDeltaIngestResponse) error + Recv() (*KubernetesDeltaItem, error) + grpc.ServerStream +} + +type runtimeSecurityAgentAPIKubernetesDeltaIngestServer struct { + grpc.ServerStream +} + +func (x *runtimeSecurityAgentAPIKubernetesDeltaIngestServer) Send(m *KubernetesDeltaIngestResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *runtimeSecurityAgentAPIKubernetesDeltaIngestServer) Recv() (*KubernetesDeltaItem, error) { + m := new(KubernetesDeltaItem) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func _RuntimeSecurityAgentAPI_ImageMetadataIngest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ImageMetadata) @@ -416,7 +649,7 @@ func _RuntimeSecurityAgentAPI_ImageMetadataIngest_Handler(srv interface{}, ctx c } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RuntimeSecurityAgentAPI_ImageMetadataIngest_FullMethodName, + FullMethod: "/runtime.v1.RuntimeSecurityAgentAPI/ImageMetadataIngest", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RuntimeSecurityAgentAPIServer).ImageMetadataIngest(ctx, req.(*ImageMetadata)) @@ -434,7 +667,7 @@ func _RuntimeSecurityAgentAPI_KubeBenchReportIngest_Handler(srv interface{}, ctx } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RuntimeSecurityAgentAPI_KubeBenchReportIngest_FullMethodName, + FullMethod: "/runtime.v1.RuntimeSecurityAgentAPI/KubeBenchReportIngest", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RuntimeSecurityAgentAPIServer).KubeBenchReportIngest(ctx, req.(*KubeBenchReport)) @@ -452,7 +685,7 @@ func _RuntimeSecurityAgentAPI_KubeLinterReportIngest_Handler(srv interface{}, ct } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RuntimeSecurityAgentAPI_KubeLinterReportIngest_FullMethodName, + FullMethod: "/runtime.v1.RuntimeSecurityAgentAPI/KubeLinterReportIngest", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RuntimeSecurityAgentAPIServer).KubeLinterReportIngest(ctx, req.(*KubeLinterReport)) @@ -504,8 +737,8 @@ var RuntimeSecurityAgentAPI_ServiceDesc = grpc.ServiceDesc{ ClientStreams: true, }, { - StreamName: "ContainerStatsWriteStream", - Handler: _RuntimeSecurityAgentAPI_ContainerStatsWriteStream_Handler, + StreamName: "StatsWriteStream", + Handler: _RuntimeSecurityAgentAPI_StatsWriteStream_Handler, ClientStreams: true, }, { diff --git a/charts/kvisor/values-local.yaml b/charts/kvisor/values-local.yaml index c61219ab..2c583cd1 100644 --- a/charts/kvisor/values-local.yaml +++ b/charts/kvisor/values-local.yaml @@ -15,11 +15,11 @@ agent: extraArgs: log-level: debug prom-metrics-export-interval: 10s - container-stats-scrape-interval: 10s pyroscope-addr: http://kvisord-pyroscope:4040 file-hash-enricher-enabled: true signature-socks5-detection-enabled: true - container-stats-enabled: true + stats-enabled: true + stats-scrape-interval: 5s ebpf-events-enabled: true netflow-enabled: true netflow-sample-submit-interval-seconds: 1 diff --git a/cmd/agent/daemon/app/app.go b/cmd/agent/daemon/app/app.go index 8ce58e05..b4cfd7f9 100644 --- a/cmd/agent/daemon/app/app.go +++ b/cmd/agent/daemon/app/app.go @@ -62,7 +62,7 @@ type Config struct { HostCgroupsDir string `json:"hostCgroupsDir"` MetricsHTTPListenPort int `json:"metricsHTTPListenPort"` State state.Config `json:"state"` - ContainerStatsEnabled bool `json:"containerStatsEnabled"` + StatsEnabled bool `json:"statsEnabled"` EBPFEventsEnabled bool `json:"EBPFEventsEnabled"` EBPFEventsOutputChanSize int `validate:"required" json:"EBPFEventsOutputChanSize"` EBPFEventsStdioExporterEnabled bool `json:"EBPFEventsStdioExporterEnabled"` @@ -166,8 +166,8 @@ func (a *App) Run(ctx context.Context) error { if cfg.EBPFEventsEnabled { exporters.Events = append(exporters.Events, state.NewCastaiEventsExporter(log, castaiClient, a.cfg.ExportersQueueSize)) } - if cfg.ContainerStatsEnabled { - exporters.ContainerStats = append(exporters.ContainerStats, state.NewCastaiContainerStatsExporter(log, castaiClient, a.cfg.ExportersQueueSize)) + if cfg.StatsEnabled { + exporters.Stats = append(exporters.Stats, state.NewCastaiStatsExporter(log, castaiClient, a.cfg.ExportersQueueSize)) } if cfg.Netflow.Enabled { exporters.Netflow = append(exporters.Netflow, state.NewCastaiNetflowExporter(log, castaiClient, a.cfg.ExportersQueueSize)) @@ -236,7 +236,9 @@ func (a *App) Run(ctx context.Context) error { withPyroscope(podName, addr) } - cgroupClient, err := cgroup.NewClient(log, a.cfg.HostCgroupsDir) + procHandler := proc.New() + + cgroupClient, err := cgroup.NewClient(log, a.cfg.HostCgroupsDir, procHandler.PSIEnabled()) if err != nil { return err } @@ -247,7 +249,6 @@ func (a *App) Run(ctx context.Context) error { } defer criCloseFn() //nolint:errcheck - procHandler := proc.New() containersClient, err := containers.NewClient(log, cgroupClient, a.cfg.ContainerdSockPath, procHandler, criClient, a.cfg.EventLabels, a.cfg.EventAnnotations) if err != nil { return err @@ -311,7 +312,7 @@ func (a *App) Run(ctx context.Context) error { HomePIDNS: pidNSID, NetflowSampleSubmitIntervalSeconds: a.cfg.Netflow.SampleSubmitIntervalSeconds, NetflowGrouping: a.cfg.Netflow.Grouping, - TrackSyscallStats: cfg.ContainerStatsEnabled, + TrackSyscallStats: cfg.StatsEnabled, ProcessTreeCollector: processTreeCollector, MetricsReporting: ebpftracer.MetricsReportingConfig{ ProgramMetricsEnabled: cfg.EBPFMetrics.ProgramMetricsEnabled, @@ -344,6 +345,7 @@ func (a *App) Run(ctx context.Context) error { enrichmentService, kubeAPIServerClient, processTreeCollector, + procHandler, ) errg, ctx := errgroup.WithContext(ctx) diff --git a/cmd/agent/daemon/daemon.go b/cmd/agent/daemon/daemon.go index a83b2c23..4b71afac 100644 --- a/cmd/agent/daemon/daemon.go +++ b/cmd/agent/daemon/daemon.go @@ -53,8 +53,8 @@ func NewRunCommand(version string) *cobra.Command { pyroscopeAddr = command.Flags().String("pyroscope-addr", "", "Enable pyroscope tracing") hostCgroupsDir = command.Flags().String("host-cgroups", "/cgroups", "Host /sys/fs/cgroups directory name mounted to container") - containerStatsEnabled = command.Flags().Bool("container-stats-enabled", false, "Enable container stats scraping") - containerStatsScrapeInterval = command.Flags().Duration("container-stats-scrape-interval", 60*time.Second, "Container resources scrape interval") + statsEnabled = command.Flags().Bool("stats-enabled", false, "Enable stats scraping") + statsScrapeInterval = command.Flags().Duration("stats-scrape-interval", 60*time.Second, "Stats scrape interval") btfPath = command.Flags().String("btf-path", "/sys/kernel/btf/vmlinux", "btf file path") ebpfEventsEnabled = command.Flags().Bool("ebpf-events-enabled", false, "Enable ebpf events") @@ -151,10 +151,10 @@ func NewRunCommand(version string) *cobra.Command { ContainerdSockPath: *containerdSockPath, HostCgroupsDir: *hostCgroupsDir, MetricsHTTPListenPort: *metricsHTTPListenPort, - ContainerStatsEnabled: *containerStatsEnabled, + StatsEnabled: *statsEnabled, State: state.Config{ - ContainerStatsScrapeInterval: *containerStatsScrapeInterval, - NetflowExportInterval: *netflowExportInterval, + StatsScrapeInterval: *statsScrapeInterval, + NetflowExportInterval: *netflowExportInterval, }, EBPFEventsEnabled: *ebpfEventsEnabled, EBPFEventsStdioExporterEnabled: *ebpfEventsStdioExporterEnabled, diff --git a/cmd/agent/daemon/metrics/agent.go b/cmd/agent/daemon/metrics/agent.go index 139abeff..c393708d 100644 --- a/cmd/agent/daemon/metrics/agent.go +++ b/cmd/agent/daemon/metrics/agent.go @@ -10,6 +10,7 @@ const ( ExporterName string = "exporter" MetricLabel string = "metric" EBPFProgramLabel string = "program" + StatsKind string = "kind" ) var ( @@ -96,4 +97,9 @@ var ( Name: "kvisor_agent_ebpf_program_run_count", Help: "Number of times a certain eBPF program run as reported by the kernel", }, []string{EBPFProgramLabel}) + + AgentStatsScrapeErrorsTotal = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "kvisor_agent_stats_scrape_errors_total", + Help: "Stats scrape errors", + }, []string{StatsKind}) ) diff --git a/cmd/agent/daemon/state/castai_container_stats_exporter.go b/cmd/agent/daemon/state/castai_stats_exporter.go similarity index 57% rename from cmd/agent/daemon/state/castai_container_stats_exporter.go rename to cmd/agent/daemon/state/castai_stats_exporter.go index 09329fdb..d49ed6a7 100644 --- a/cmd/agent/daemon/state/castai_container_stats_exporter.go +++ b/cmd/agent/daemon/state/castai_stats_exporter.go @@ -11,34 +11,34 @@ import ( "google.golang.org/grpc" ) -func NewCastaiContainerStatsExporter(log *logging.Logger, apiClient *castai.Client, queueSize int) *CastaiContainerStatsExporter { - return &CastaiContainerStatsExporter{ - log: log.WithField("component", "castai_container_stats_exporter"), +func NewCastaiStatsExporter(log *logging.Logger, apiClient *castai.Client, queueSize int) *CastaiStatsExporter { + return &CastaiStatsExporter{ + log: log.WithField("component", "castai_stats_exporter"), apiClient: apiClient, - queue: make(chan *castpb.ContainerStatsBatch, queueSize), + queue: make(chan *castpb.StatsBatch, queueSize), writeStreamCreateRetryDelay: 2 * time.Second, } } -type CastaiContainerStatsExporter struct { +type CastaiStatsExporter struct { log *logging.Logger apiClient *castai.Client - queue chan *castpb.ContainerStatsBatch + queue chan *castpb.StatsBatch writeStreamCreateRetryDelay time.Duration } -func (c *CastaiContainerStatsExporter) Run(ctx context.Context) error { +func (c *CastaiStatsExporter) Run(ctx context.Context) error { c.log.Info("running export loop") defer c.log.Info("export loop done") - ws := castai.NewWriteStream[*castpb.ContainerStatsBatch, *castpb.WriteStreamResponse](ctx, func(ctx context.Context) (grpc.ClientStream, error) { - return c.apiClient.GRPC.ContainerStatsWriteStream(ctx) + ws := castai.NewWriteStream[*castpb.StatsBatch, *castpb.WriteStreamResponse](ctx, func(ctx context.Context) (grpc.ClientStream, error) { + return c.apiClient.GRPC.StatsWriteStream(ctx) }) defer ws.Close() ws.ReopenDelay = c.writeStreamCreateRetryDelay - sendErrorMetric := metrics.AgentExporterSendErrorsTotal.WithLabelValues("castai_container_stats") - sendMetric := metrics.AgentExporterSendTotal.WithLabelValues("castai_container_stats") + sendErrorMetric := metrics.AgentExporterSendErrorsTotal.WithLabelValues("castai_stats") + sendMetric := metrics.AgentExporterSendTotal.WithLabelValues("castai_stats") for { select { @@ -54,10 +54,10 @@ func (c *CastaiContainerStatsExporter) Run(ctx context.Context) error { } } -func (c *CastaiContainerStatsExporter) Enqueue(e *castpb.ContainerStatsBatch) { +func (c *CastaiStatsExporter) Enqueue(e *castpb.StatsBatch) { select { case c.queue <- e: default: - metrics.AgentExporterQueueDroppedTotal.WithLabelValues("castai_container_stats").Inc() + metrics.AgentExporterQueueDroppedTotal.WithLabelValues("castai_stats").Inc() } } diff --git a/cmd/agent/daemon/state/container_stats_pipeline.go b/cmd/agent/daemon/state/container_stats_pipeline.go deleted file mode 100644 index cb824fce..00000000 --- a/cmd/agent/daemon/state/container_stats_pipeline.go +++ /dev/null @@ -1,265 +0,0 @@ -package state - -import ( - "context" - "errors" - "math" - "time" - - castpb "github.com/castai/kvisor/api/v1/runtime" - "github.com/castai/kvisor/cmd/agent/daemon/netstats" - "github.com/castai/kvisor/pkg/containers" - "github.com/castai/kvisor/pkg/ebpftracer" - "github.com/castai/kvisor/pkg/stats" - "github.com/samber/lo" - "k8s.io/apimachinery/pkg/api/resource" -) - -func (c *Controller) runContainerStatsPipeline(ctx context.Context) error { - c.log.Info("running container stats pipeline") - defer c.log.Info("container stats pipeline done") - - ticker := time.NewTicker(c.cfg.ContainerStatsScrapeInterval) - defer ticker.Stop() - - for { - select { - case <-ctx.Done(): - return ctx.Err() - case <-ticker.C: - batch := &castpb.ContainerStatsBatch{} - c.scrapeContainersResourceStats(batch) - c.scrapeContainersSyscallStats(ctx, batch) - if len(batch.Items) > 0 { - for _, exp := range c.exporters.ContainerStats { - exp.Enqueue(batch) - } - } - } - } -} - -func (c *Controller) scrapeContainersResourceStats(batch *castpb.ContainerStatsBatch) { - for _, cont := range c.containersClient.ListContainers() { - if cont.Name == "" { - // We ignore containers that do not have a name, as they are likely just the pause containers. - continue - } - - // TODO: This is now never filled. For some reasons some calls to containerd returns context deadline errors. - if len(cont.PIDs) == 0 { - continue - } - - if c.IsMutedNamespace(cont.PodNamespace) { - continue - } - - now := time.Now().UTC() - cpu, err := c.containersClient.GetCgroupCpuStats(cont) - if err != nil { - // TODO: Metrics - continue - } - mem, err := c.containersClient.GetCgroupMemoryStats(cont) - if err != nil { - // TODO: Metrics - continue - } - - netStats, err := c.netStatsReader.Read(cont.PIDs[0]) - if err != nil { - // TODO: metrics or handle this better, getting sometimes no such file or directory - continue - } - mainNicStats, _ := lo.Find(netStats, func(item netstats.InterfaceStats) bool { - return item.Name == "eth0" - }) - - currScrape := &resourcesStatsScrapePoint{ - ts: now, - cpuStat: cpu, - memStats: mem, - netStats: &mainNicStats, - } - - // We need at least 2 scrapes to calculate diff count. - c.resourcesStatsScrapePointsMu.RLock() - prevScrape, found := c.resourcesStatsScrapePoints[cont.CgroupID] - c.resourcesStatsScrapePointsMu.RUnlock() - if !found { - c.resourcesStatsScrapePointsMu.Lock() - c.resourcesStatsScrapePoints[cont.CgroupID] = currScrape - c.resourcesStatsScrapePointsMu.Unlock() - continue - } - - pbStats := c.collectContainerResourcesStats(prevScrape, currScrape) - if len(pbStats) > 0 { - batch.Items = append(batch.Items, &castpb.ContainerStats{ - Namespace: cont.PodNamespace, - PodName: cont.PodName, - ContainerName: cont.Name, - PodUid: cont.PodUID, - ContainerId: cont.ID, - Stats: pbStats, - }) - } - - prevScrape.ts = currScrape.ts - prevScrape.cpuStat = currScrape.cpuStat - prevScrape.memStats = currScrape.memStats - prevScrape.netStats = currScrape.netStats - } -} - -func (c *Controller) collectContainerResourcesStats(prev, curr *resourcesStatsScrapePoint) []*castpb.Stats { - // TODO(Kvisord): Add io stats. - var pbStats []*castpb.Stats - - // CPU stats. Stored as cpu millicores used during this scrape period. - // Stored values can be used directly with `avg(value)`. - window := curr.ts.Sub(prev.ts) - cpuUsage := uint64Quantity(uint64((curr.cpuStat.UsageSeconds-prev.cpuStat.UsageSeconds)/window.Seconds()*1e9), resource.DecimalSI, -9) - cpuThrottled := uint64Quantity(uint64((curr.cpuStat.ThrottledTimeSeconds-prev.cpuStat.ThrottledTimeSeconds)/window.Seconds()*1e9), resource.DecimalSI, -9) - if v := cpuUsage.MilliValue(); v > 0 { - pbStats = append(pbStats, &castpb.Stats{ - Group: castpb.StatsGroup_STATS_GROUP_CPU, - Subgroup: stats.SubgroupCPUUsage, - Value: float64(v), - }) - } - if v := cpuThrottled.MilliValue(); v > 0 { - pbStats = append(pbStats, &castpb.Stats{ - Group: castpb.StatsGroup_STATS_GROUP_CPU, - Subgroup: stats.SubgroupCPUThrottled, - Value: float64(v), - }) - } - - // Memory stats. - if v := curr.memStats.RSS; v > 0 { - pbStats = append(pbStats, &castpb.Stats{ - Group: castpb.StatsGroup_STATS_GROUP_MEMORY, - Subgroup: stats.SubgroupMemoryUsage, - Value: float64(v), - }) - } - if v := curr.memStats.Limit; v > 0 { - pbStats = append(pbStats, &castpb.Stats{ - Group: castpb.StatsGroup_STATS_GROUP_MEMORY, - Subgroup: stats.SubgroupMemoryLimit, - Value: float64(v), - }) - } - - // Network stats. Saved as deltas. - // Stored values can be converted to rate similar to prometheus by `sum(value)/60` for period is one minute. - if v := curr.netStats.TxBytes - prev.netStats.TxBytes; v > 0 { - pbStats = append(pbStats, &castpb.Stats{ - Group: castpb.StatsGroup_STATS_GROUP_NET, - Subgroup: stats.SubgroupNetworkTxBytes, - Value: float64(v), - }) - } - if v := curr.netStats.TxDropped - prev.netStats.TxDropped; v > 0 { - pbStats = append(pbStats, &castpb.Stats{ - Group: castpb.StatsGroup_STATS_GROUP_NET, - Subgroup: stats.SubgroupNetworkTxDropped, - Value: float64(v), - }) - } - if v := curr.netStats.RxBytes - prev.netStats.RxBytes; v > 0 { - pbStats = append(pbStats, &castpb.Stats{ - Group: castpb.StatsGroup_STATS_GROUP_NET, - Subgroup: stats.SubgroupNetworkRxBytes, - Value: float64(v), - }) - } - if v := curr.netStats.RxDropped - prev.netStats.RxDropped; v > 0 { - pbStats = append(pbStats, &castpb.Stats{ - Group: castpb.StatsGroup_STATS_GROUP_NET, - Subgroup: stats.SubgroupNetworkRxDropped, - Value: float64(v), - }) - } - - return pbStats -} - -func (c *Controller) scrapeContainersSyscallStats(ctx context.Context, batch *castpb.ContainerStatsBatch) { - st, err := c.tracer.ReadSyscallStats() - if err != nil { - c.log.Errorf("reading syscalls stats from kernel: %v", err) - return - } - - for cgroupID, syscallStats := range st { - cont, err := c.containersClient.GetContainerForCgroup(ctx, uint64(cgroupID)) - if err != nil { - if !errors.Is(err, containers.ErrContainerNotFound) { - c.log.Errorf("getting container: %v", err) - } - continue - } - - if c.IsMutedNamespace(cont.PodNamespace) { - continue - } - - // We need at least 2 scrapes to calculate diff count. - c.syscallScrapePointsMu.RLock() - prevScrape, found := c.syscallScrapePoints[cont.CgroupID] - c.syscallScrapePointsMu.RUnlock() - if !found { - syscalls := make(map[ebpftracer.SyscallID]uint64, len(syscallStats)) - for _, v := range syscallStats { - syscalls[v.ID] = v.Count - } - c.syscallScrapePointsMu.Lock() - c.syscallScrapePoints[cont.CgroupID] = &syscallScrapePoint{ - syscalls: syscalls, - } - c.syscallScrapePointsMu.Unlock() - continue - } - - cgStats := &castpb.ContainerStats{ - Namespace: cont.PodNamespace, - PodName: cont.PodName, - ContainerName: cont.Name, - PodUid: cont.PodUID, - ContainerId: cont.ID, - } - for _, stat := range syscallStats { - prevValue := prevScrape.syscalls[stat.ID] - currValue := float64(stat.Count - prevValue) - if currValue == 0 { - continue - } - cgStats.Stats = append(cgStats.Stats, &castpb.Stats{ - Group: castpb.StatsGroup_STATS_GROUP_SYSCALL, - Subgroup: uint32(stat.ID), - Value: currValue, - }) - } - if len(cgStats.Stats) > 0 { - batch.Items = append(batch.Items, cgStats) - } - - syscalls := make(map[ebpftracer.SyscallID]uint64, len(syscallStats)) - for _, v := range syscallStats { - syscalls[v.ID] = v.Count - } - prevScrape.syscalls = syscalls - } -} - -func uint64Quantity(val uint64, format resource.Format, scale resource.Scale) resource.Quantity { - q := *resource.NewScaledQuantity(int64(val), scale) // nolint:gosec - if val > math.MaxInt64 { - q = *resource.NewScaledQuantity(int64(val/10), resource.Scale(1)+scale) // nolint:gosec - } - q.Format = format - return q -} diff --git a/cmd/agent/daemon/state/controller.go b/cmd/agent/daemon/state/controller.go index 554bc1dd..f1aeecb2 100644 --- a/cmd/agent/daemon/state/controller.go +++ b/cmd/agent/daemon/state/controller.go @@ -9,7 +9,7 @@ import ( "time" kubepb "github.com/castai/kvisor/api/v1/kube" - castpb "github.com/castai/kvisor/api/v1/runtime" + castaipb "github.com/castai/kvisor/api/v1/runtime" "github.com/castai/kvisor/cmd/agent/daemon/enrichment" "github.com/castai/kvisor/cmd/agent/daemon/netstats" "github.com/castai/kvisor/pkg/cgroup" @@ -24,7 +24,7 @@ import ( ) type Config struct { - ContainerStatsScrapeInterval time.Duration `json:"containerStatsScrapeInterval"` + StatsScrapeInterval time.Duration `json:"statsScrapeInterval"` NetflowExportInterval time.Duration `validate:"required" json:"netflowExportInterval"` } @@ -37,8 +37,7 @@ type containersClient interface { GetCgroupsInNamespace(namespace string) []uint64 RegisterContainerCreatedListener(l containers.ContainerCreatedListener) RegisterContainerDeletedListener(l containers.ContainerDeletedListener) - GetCgroupCpuStats(c *containers.Container) (*cgroup.CPUStat, error) - GetCgroupMemoryStats(c *containers.Container) (*cgroup.MemoryStat, error) + GetCgroupStats(c *containers.Container) (cgroup.Stats, error) } type netStatsReader interface { @@ -57,12 +56,12 @@ type ebpfTracer interface { } type signatureEngine interface { - Events() <-chan *castpb.Event + Events() <-chan *castaipb.Event } type enrichmentService interface { Enqueue(e *enrichment.EnrichRequest) bool - Events() <-chan *castpb.Event + Events() <-chan *castaipb.Event } type conntrackClient interface { @@ -73,6 +72,12 @@ type processTreeCollector interface { Events() <-chan processtree.ProcessTreeEvent } +type procHandler interface { + PSIEnabled() bool + GetPSIStats(file string) (*castaipb.PSIStats, error) + GetMeminfoStats() (*castaipb.MemoryStats, error) +} + func NewController( log *logging.Logger, cfg Config, @@ -85,6 +90,7 @@ func NewController( enrichmentService enrichmentService, kubeClient kubepb.KubeAPIClient, processTreeCollector processTreeCollector, + procHandler procHandler, ) *Controller { dnsCache, err := freelru.NewSynced[uint64, *freelru.SyncedLRU[netip.Addr, string]](1024, func(k uint64) uint32 { return uint32(k) // nolint:gosec @@ -125,13 +131,13 @@ func NewController( enrichmentService: enrichmentService, kubeClient: kubeClient, nodeName: os.Getenv("NODE_NAME"), - resourcesStatsScrapePoints: map[uint64]*resourcesStatsScrapePoint{}, - syscallScrapePoints: map[uint64]*syscallScrapePoint{}, + containerStatsScrapePoints: map[uint64]*containerStatsScrapePoint{}, mutedNamespaces: map[string]struct{}{}, dnsCache: dnsCache, podCache: podCache, conntrackCache: conntrackCache, processTreeCollector: processTreeCollector, + procHandler: procHandler, } } @@ -146,14 +152,14 @@ type Controller struct { enrichmentService enrichmentService processTreeCollector processTreeCollector exporters *Exporters + procHandler procHandler nodeName string // Scrape points are used to calculate deltas between scrapes. - resourcesStatsScrapePointsMu sync.RWMutex - resourcesStatsScrapePoints map[uint64]*resourcesStatsScrapePoint - syscallScrapePointsMu sync.RWMutex - syscallScrapePoints map[uint64]*syscallScrapePoint + containerStatsScrapePointsMu sync.RWMutex + containerStatsScrapePoints map[uint64]*containerStatsScrapePoint + nodeScrapePoint *nodeScrapePoint mutedNamespacesMu sync.RWMutex mutedNamespaces map[string]struct{} @@ -178,9 +184,9 @@ func (c *Controller) Run(ctx context.Context) error { return c.runEventsPipeline(ctx) }) } - if len(c.exporters.ContainerStats) > 0 { + if len(c.exporters.Stats) > 0 { errg.Go(func() error { - return c.runContainerStatsPipeline(ctx) + return c.runStatsPipeline(ctx) }) } if len(c.exporters.Netflow) > 0 { @@ -211,30 +217,15 @@ func (c *Controller) onNewContainer(container *containers.Container) { } func (c *Controller) onDeleteContainer(container *containers.Container) { - c.resourcesStatsScrapePointsMu.Lock() - delete(c.resourcesStatsScrapePoints, container.CgroupID) - c.resourcesStatsScrapePointsMu.Unlock() - - c.syscallScrapePointsMu.Lock() - delete(c.syscallScrapePoints, container.CgroupID) - c.syscallScrapePointsMu.Unlock() + c.containerStatsScrapePointsMu.Lock() + delete(c.containerStatsScrapePoints, container.CgroupID) + c.containerStatsScrapePointsMu.Unlock() c.dnsCache.Remove(container.CgroupID) c.log.Debugf("removed cgroup %d", container.CgroupID) } -type resourcesStatsScrapePoint struct { - ts time.Time - cpuStat *cgroup.CPUStat - memStats *cgroup.MemoryStat - netStats *netstats.InterfaceStats -} - -type syscallScrapePoint struct { - syscalls map[ebpftracer.SyscallID]uint64 -} - func (c *Controller) MuteNamespace(namespace string) error { c.mutedNamespacesMu.Lock() c.mutedNamespaces[namespace] = struct{}{} diff --git a/cmd/agent/daemon/state/controller_test.go b/cmd/agent/daemon/state/controller_test.go index fa5dfc5d..b547fe5c 100644 --- a/cmd/agent/daemon/state/controller_test.go +++ b/cmd/agent/daemon/state/controller_test.go @@ -147,8 +147,7 @@ func TestController(t *testing.T) { PodUID: "abcd", PodName: "test-pod", Cgroup: &cgroup.Cgroup{ - Id: 100, - Version: 2, + Id: 100, }, PIDs: []uint32{1}, }) @@ -187,8 +186,8 @@ type customizeMockContainersClient func(t *mockContainersClient) func newTestController(opts ...any) *Controller { log := logging.NewTestLog() cfg := Config{ - ContainerStatsScrapeInterval: time.Millisecond, - NetflowExportInterval: time.Millisecond, + StatsScrapeInterval: time.Millisecond, + NetflowExportInterval: time.Millisecond, } exporters := NewExporters(log) contClient := &mockContainersClient{} @@ -210,6 +209,9 @@ func newTestController(opts ...any) *Controller { enrichService := &mockEnrichmentService{eventsChan: make(chan *castaipb.Event, 100)} kubeClient := &mockKubeClient{} processTreeCollector := &mockProcessTreeController{} + + procHandler := &mockProcHandler{} + ctrl := NewController( log, cfg, @@ -222,6 +224,7 @@ func newTestController(opts ...any) *Controller { enrichService, kubeClient, processTreeCollector, + procHandler, ) return ctrl } @@ -239,14 +242,14 @@ func (m *mockEventsExporter) Enqueue(e *castaipb.Event) { } type mockContainerStatsExporter struct { - events chan *castaipb.ContainerStatsBatch + events chan *castaipb.StatsBatch } func (m *mockContainerStatsExporter) Run(ctx context.Context) error { return nil } -func (m *mockContainerStatsExporter) Enqueue(e *castaipb.ContainerStatsBatch) { +func (m *mockContainerStatsExporter) Enqueue(e *castaipb.StatsBatch) { m.events <- e } @@ -266,12 +269,8 @@ type mockContainersClient struct { list []*containers.Container } -func (m *mockContainersClient) GetCgroupCpuStats(c *containers.Container) (*cgroup.CPUStat, error) { - return &cgroup.CPUStat{}, nil -} - -func (m *mockContainersClient) GetCgroupMemoryStats(c *containers.Container) (*cgroup.MemoryStat, error) { - return &cgroup.MemoryStat{}, nil +func (m *mockContainersClient) GetCgroupStats(c *containers.Container) (cgroup.Stats, error) { + return cgroup.Stats{}, nil } func (m *mockContainersClient) ListContainers() []*containers.Container { @@ -443,3 +442,18 @@ func getOptOr[T any](opts []any, or T) T { return or } + +type mockProcHandler struct { +} + +func (m mockProcHandler) PSIEnabled() bool { + return true +} + +func (m mockProcHandler) GetPSIStats(file string) (*castaipb.PSIStats, error) { + return &castaipb.PSIStats{}, nil +} + +func (m mockProcHandler) GetMeminfoStats() (*castaipb.MemoryStats, error) { + return &castaipb.MemoryStats{}, nil +} diff --git a/cmd/agent/daemon/state/exporter.go b/cmd/agent/daemon/state/exporter.go index dd28fa4c..4bf85b8a 100644 --- a/cmd/agent/daemon/state/exporter.go +++ b/cmd/agent/daemon/state/exporter.go @@ -18,14 +18,14 @@ func NewExporters(log *logging.Logger) *Exporters { type Exporters struct { log *logging.Logger - Events []EventsExporter - ContainerStats []ContainerStatsExporter - Netflow []NetflowExporter - ProcessTree []ProcessTreeExporter + Events []EventsExporter + Stats []StatsExporter + Netflow []NetflowExporter + ProcessTree []ProcessTreeExporter } func (e *Exporters) Empty() bool { - return len(e.Events) == 0 && len(e.ContainerStats) == 0 && len(e.Netflow) == 0 && len(e.ProcessTree) == 0 + return len(e.Events) == 0 && len(e.Stats) == 0 && len(e.Netflow) == 0 && len(e.ProcessTree) == 0 } func (e *Exporters) Run(ctx context.Context) error { @@ -39,7 +39,7 @@ func (e *Exporters) Run(ctx context.Context) error { return exp.Run(ctx) }) } - for _, exp := range e.ContainerStats { + for _, exp := range e.Stats { exp := exp errg.Go(func() error { return exp.Run(ctx) @@ -69,9 +69,9 @@ type EventsExporter interface { Enqueue(e *castpb.Event) } -type ContainerStatsExporter interface { +type StatsExporter interface { DataExporter - Enqueue(e *castpb.ContainerStatsBatch) + Enqueue(e *castpb.StatsBatch) } type NetflowExporter interface { diff --git a/cmd/agent/daemon/state/stats_pipeline.go b/cmd/agent/daemon/state/stats_pipeline.go new file mode 100644 index 00000000..4f783132 --- /dev/null +++ b/cmd/agent/daemon/state/stats_pipeline.go @@ -0,0 +1,225 @@ +package state + +import ( + "context" + "log/slog" + "time" + + castaipb "github.com/castai/kvisor/api/v1/runtime" + "github.com/castai/kvisor/cmd/agent/daemon/metrics" + "github.com/castai/kvisor/pkg/containers" +) + +type containerStatsScrapePoint struct { + cpuStat *castaipb.CpuStats + memStat *castaipb.MemoryStats + ioStat *castaipb.IOStats +} + +type nodeScrapePoint struct { + cpuStat *castaipb.CpuStats + memStat *castaipb.MemoryStats + ioStat *castaipb.IOStats +} + +func (c *Controller) runStatsPipeline(ctx context.Context) error { + c.log.Info("running stats pipeline") + defer c.log.Info("stats pipeline done") + + ticker := time.NewTicker(c.cfg.StatsScrapeInterval) + defer ticker.Stop() + + // Initial scrape to populate initial points for diffs. + c.scrapeNodeStats(nil) + c.scrapeContainersResourceStats(nil) + + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-ticker.C: + func() { + start := time.Now() + batch := &castaipb.StatsBatch{} + c.scrapeNodeStats(batch) + c.scrapeContainersResourceStats(batch) + if len(batch.Items) > 0 { + for _, exp := range c.exporters.Stats { + exp.Enqueue(batch) + } + } + c.log.Debugf("stats exported, duration=%v", time.Since(start)) + }() + } + } +} + +func (c *Controller) scrapeContainersResourceStats(batch *castaipb.StatsBatch) { + for _, cont := range c.containersClient.ListContainers() { + c.scrapeContainerResourcesStats(cont, batch) + } +} + +func (c *Controller) scrapeContainerResourcesStats(cont *containers.Container, batch *castaipb.StatsBatch) { + cgStats, err := c.containersClient.GetCgroupStats(cont) + if err != nil { + if c.log.IsEnabled(slog.LevelDebug) { + c.log.Errorf("getting cgroup stats for container %q: %v", cont.Name, err) + } + metrics.AgentStatsScrapeErrorsTotal.WithLabelValues("container").Inc() + return + } + + currScrape := &containerStatsScrapePoint{ + cpuStat: cgStats.CpuStats, + memStat: cgStats.MemoryStats, + ioStat: cgStats.IOStats, + } + + // We need at least 2 scrapes to calculate diffs. + // Diffs are needed for always increasing counters only because we store them as deltas. + // This includes cpu usage and psi total value. + c.containerStatsScrapePointsMu.RLock() + prevScrape, found := c.containerStatsScrapePoints[cont.CgroupID] + c.containerStatsScrapePointsMu.RUnlock() + if !found { + c.containerStatsScrapePointsMu.Lock() + c.containerStatsScrapePoints[cont.CgroupID] = currScrape + c.containerStatsScrapePointsMu.Unlock() + return + } + + if batch == nil { + return + } + + item := &castaipb.ContainerStats{ + Namespace: cont.PodNamespace, + PodName: cont.PodName, + ContainerName: cont.Name, + PodUid: cont.PodUID, + ContainerId: cont.ID, + CpuStats: getCPUStatsDiff(prevScrape.cpuStat, currScrape.cpuStat), + MemoryStats: getMemoryStatsDiff(prevScrape.memStat, currScrape.memStat), + PidsStats: cgStats.PidsStats, + IoStats: getIOStatsDiff(prevScrape.ioStat, currScrape.ioStat), + } + if podInfo, ok := c.getPodInfo(cont.PodUID); ok { + item.NodeName = podInfo.NodeName + item.WorkloadName = podInfo.WorkloadName + item.WorkloadKind = podInfo.WorkloadKind + } + batch.Items = append(batch.Items, &castaipb.StatsItem{Data: &castaipb.StatsItem_Container{Container: item}}) + + prevScrape.cpuStat = currScrape.cpuStat + prevScrape.memStat = currScrape.memStat + prevScrape.ioStat = currScrape.ioStat +} + +func (c *Controller) scrapeNodeStats(batch *castaipb.StatsBatch) { + if err := func() error { + // For now, we only care about PSI related metrics on node. + if !c.procHandler.PSIEnabled() { + return nil + } + + cpuPSI, err := c.procHandler.GetPSIStats("cpu") + if err != nil { + return err + } + memStats, err := c.procHandler.GetMeminfoStats() + if err != nil { + return err + } + memoryPSI, err := c.procHandler.GetPSIStats("memory") + if err != nil { + return err + } + ioPSI, err := c.procHandler.GetPSIStats("io") + if err != nil { + return err + } + + currScrape := &nodeScrapePoint{ + cpuStat: &castaipb.CpuStats{Psi: cpuPSI}, + memStat: &castaipb.MemoryStats{ + Usage: memStats.Usage, + SwapOnlyUsage: memStats.SwapOnlyUsage, + Psi: memoryPSI, + }, + ioStat: &castaipb.IOStats{Psi: ioPSI}, + } + + // We need at least 2 scrapes to calculate diffs. + // Diffs are needed for always increasing counters only because we store them as deltas. + // This includes cpu usage and psi total value. + if c.nodeScrapePoint == nil { + c.nodeScrapePoint = currScrape + return nil + } + if batch == nil { + return nil + } + + batch.Items = append(batch.Items, &castaipb.StatsItem{Data: &castaipb.StatsItem_Node{ + Node: &castaipb.NodeStats{ + NodeName: c.nodeName, + CpuStats: getCPUStatsDiff(c.nodeScrapePoint.cpuStat, currScrape.cpuStat), + MemoryStats: getMemoryStatsDiff(c.nodeScrapePoint.memStat, currScrape.memStat), + IoStats: getIOStatsDiff(c.nodeScrapePoint.ioStat, currScrape.ioStat), + }, + }}) + + c.nodeScrapePoint.cpuStat = currScrape.cpuStat + c.nodeScrapePoint.memStat = currScrape.memStat + c.nodeScrapePoint.ioStat = currScrape.ioStat + + return nil + }(); err != nil { + if c.log.IsEnabled(slog.LevelDebug) { + c.log.Errorf("getting cgroup stats for node %q: %v", c.nodeName, err) + } + metrics.AgentStatsScrapeErrorsTotal.WithLabelValues("node").Inc() + return + } +} + +func getCPUStatsDiff(prev, curr *castaipb.CpuStats) *castaipb.CpuStats { + return &castaipb.CpuStats{ + TotalUsage: curr.TotalUsage - prev.TotalUsage, + UsageInKernelmode: curr.UsageInKernelmode - prev.UsageInKernelmode, + UsageInUsermode: curr.UsageInUsermode - prev.UsageInUsermode, + ThrottledPeriods: curr.ThrottledPeriods, + ThrottledTime: curr.ThrottledTime, + Psi: getPSIStatsDiff(prev.Psi, curr.Psi), + } +} + +func getMemoryStatsDiff(prev, curr *castaipb.MemoryStats) *castaipb.MemoryStats { + return &castaipb.MemoryStats{ + Cache: curr.Cache, + Usage: curr.Usage, + SwapOnlyUsage: curr.SwapOnlyUsage, + Psi: getPSIStatsDiff(prev.Psi, curr.Psi), + } +} + +func getIOStatsDiff(prev, curr *castaipb.IOStats) *castaipb.IOStats { + return &castaipb.IOStats{ + Psi: getPSIStatsDiff(prev.Psi, curr.Psi), + } +} + +func getPSIStatsDiff(prev, curr *castaipb.PSIStats) *castaipb.PSIStats { + if prev == nil || curr == nil { + return nil + } + return &castaipb.PSIStats{ + Some: &castaipb.PSIData{ + Total: curr.Some.Total - prev.Some.Total, + }, + Full: &castaipb.PSIData{ + Total: curr.Full.Total - prev.Full.Total, + }, + } +} diff --git a/cmd/controller/state/castai_controller_test.go b/cmd/controller/state/castai_controller_test.go index 46ec77aa..17549eb6 100644 --- a/cmd/controller/state/castai_controller_test.go +++ b/cmd/controller/state/castai_controller_test.go @@ -124,7 +124,7 @@ func (t testGrpcClient) LogsWriteStream(ctx context.Context, opts ...grpc.CallOp return nil, nil } -func (t testGrpcClient) ContainerStatsWriteStream(ctx context.Context, opts ...grpc.CallOption) (castaipb.RuntimeSecurityAgentAPI_ContainerStatsWriteStreamClient, error) { +func (t testGrpcClient) StatsWriteStream(ctx context.Context, opts ...grpc.CallOption) (castaipb.RuntimeSecurityAgentAPI_StatsWriteStreamClient, error) { return nil, nil } diff --git a/cmd/mock-server/main.go b/cmd/mock-server/main.go index 38dcf408..ecd6b594 100644 --- a/cmd/mock-server/main.go +++ b/cmd/mock-server/main.go @@ -157,14 +157,21 @@ func (m *MockServer) LogsWriteStream(server castaipb.RuntimeSecurityAgentAPI_Log } } -func (m *MockServer) ContainerStatsWriteStream(server castaipb.RuntimeSecurityAgentAPI_ContainerStatsWriteStreamServer) error { +func (m *MockServer) StatsWriteStream(server castaipb.RuntimeSecurityAgentAPI_StatsWriteStreamServer) error { for { event, err := server.Recv() if err != nil { return err } for _, v := range event.Items { - m.log.Debugf("container_stats, ns=%s, pod=%s, cont=%s, items=%d", v.Namespace, v.PodName, v.ContainerName, len(v.Stats)) + cont := v.GetContainer() + if cont != nil { + m.log.Debugf("container_stats, ns=%s, pod=%s, cont=%s, cpu=%v, mem=%v", cont.Namespace, cont.PodName, cont.ContainerName, cont.CpuStats, cont.MemoryStats) + } + node := v.GetNode() + if node != nil { + m.log.Debugf("node_stats, node=%s,cpu=%v, mem=%v", node.NodeName, node.CpuStats, node.MemoryStats) + } } } } diff --git a/e2e/e2e.go b/e2e/e2e.go index abbf767d..42d161e7 100644 --- a/e2e/e2e.go +++ b/e2e/e2e.go @@ -115,8 +115,8 @@ func run(ctx context.Context) error { // TODO: Fix container assert stats once pids are fixed. fmt.Println("🙏waiting for container stats") _ = srv.assertContainerStats - srv.containerStatsAsserted = true - srv.containerStats = nil + srv.statsAsserted = true + srv.stats = nil fmt.Println("🙏waiting for kube bench") if err := srv.assertKubeBenchReport(ctx); err != nil { @@ -162,8 +162,8 @@ func installChart(ns, imageTag string) ([]byte, error) { --set image.tag=%s \ --set agent.enabled=true \ --set agent.extraArgs.log-level=debug \ - --set agent.extraArgs.container-stats-enabled=true \ - --set agent.extraArgs.container-stats-scrape-interval=5s \ + --set agent.extraArgs.stats-enabled=true \ + --set agent.extraArgs.stats-scrape-interval=5s \ --set agent.extraArgs.castai-server-insecure=true \ --set agent.extraArgs.ebpf-events-enabled=true \ --set agent.extraArgs.file-hash-enricher-enabled=true \ @@ -207,8 +207,8 @@ type testCASTAIServer struct { testStartTime time.Time mu sync.Mutex - containerStats []*castaipb.ContainerStatsBatch - containerStatsAsserted bool + stats []*castaipb.StatsBatch + statsAsserted bool events []*castaipb.Event eventsAsserted bool logs []*castaipb.LogEvent @@ -310,20 +310,20 @@ func (t *testCASTAIServer) UpdateSyncState(ctx context.Context, request *castaip return &castaipb.UpdateSyncStateResponse{}, nil } -func (t *testCASTAIServer) ContainerStatsWriteStream(server castaipb.RuntimeSecurityAgentAPI_ContainerStatsWriteStreamServer) error { +func (t *testCASTAIServer) StatsWriteStream(server castaipb.RuntimeSecurityAgentAPI_StatsWriteStreamServer) error { for { msg, err := server.Recv() if err != nil { return err } - if t.containerStatsAsserted { + if t.statsAsserted { continue } if t.outputReceivedData { - fmt.Println("received container stats:", len(msg.Items)) + fmt.Println("received stats:", len(msg.Items)) } t.mu.Lock() - t.containerStats = append(t.containerStats, msg) + t.stats = append(t.stats, msg) t.mu.Unlock() } } @@ -812,6 +812,10 @@ func (t *testCASTAIServer) assertEvents(ctx context.Context) error { func (t *testCASTAIServer) assertContainerStats(ctx context.Context) error { timeout := time.After(10 * time.Second) + + nodeStatsAsserted := false + containerStatsAsserted := false + for { select { case <-ctx.Done(): @@ -820,34 +824,54 @@ func (t *testCASTAIServer) assertContainerStats(ctx context.Context) error { return errors.New("timeout waiting for received container stats") case <-time.After(1 * time.Second): t.mu.Lock() - stats := t.containerStats + stats := t.stats t.mu.Unlock() - if len(stats) > 0 { - sb1 := stats[0] - if len(sb1.Items) == 0 { - return errors.New("missing stat batch items") - } - i1 := sb1.Items[0] - if i1.Namespace == "" { - return errors.New("missing namespace") - } - if i1.PodName == "" { - return errors.New("missing pod") - } - if i1.ContainerName == "" { - return errors.New("missing container") - } - s1 := i1.Stats - if len(s1) == 0 { - return errors.New("missing stat items") - } - stat := s1[0] - if stat.Group == castaipb.StatsGroup_STATS_GROUP_UNKNOWN { - return errors.New("missing stat group") - } - if stat.Value == 0 { - return errors.New("missing stat value") + if len(stats) == 0 { + continue + } + + sb1 := stats[0] + if len(sb1.Items) == 0 { + return errors.New("missing stat batch items") + } + + for _, st := range stats { + for _, item := range st.Items { + cont := item.GetContainer() + if cont != nil { + if cont.Namespace == "" { + return errors.New("missing namespace") + } + if cont.PodName == "" { + return errors.New("missing pod") + } + if cont.ContainerName == "" { + return errors.New("missing container") + } + if cont.NodeName == "" { + return errors.New("missing node") + } + cpuUsage := cont.CpuStats.TotalUsage + memUsage := cont.MemoryStats.Usage.Usage + if cpuUsage == 0 && memUsage == 0 { + return errors.New("missing cpu or memory usage") + } + containerStatsAsserted = true + } + node := item.GetNode() + if node != nil { + if node.NodeName == "" { + return errors.New("missing node name") + } + if node.MemoryStats.Usage.Usage == 0 { + return errors.New("missing node memory usage") + } + nodeStatsAsserted = true + } } + } + + if containerStatsAsserted && nodeStatsAsserted { return nil } } diff --git a/go.mod b/go.mod index f9404521..8de1fa14 100644 --- a/go.mod +++ b/go.mod @@ -11,8 +11,6 @@ require ( github.com/cilium/cilium v1.17.0-pre.2 github.com/cilium/ebpf v0.16.0 github.com/containerd/containerd v1.7.24 - github.com/containerd/containerd/api v1.8.0 - github.com/containerd/typeurl v1.0.2 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/elastic/go-freelru v0.16.0 github.com/fatih/color v1.18.0 @@ -40,7 +38,6 @@ require ( github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.10.0 github.com/testcontainers/testcontainers-go v0.34.0 - github.com/tidwall/gjson v1.18.0 github.com/tklauser/go-sysconf v0.3.14 github.com/vishvananda/netns v0.0.5 go.uber.org/atomic v1.11.0 @@ -57,7 +54,6 @@ require ( k8s.io/apimachinery v0.31.3 k8s.io/client-go v0.31.3 k8s.io/cri-api v0.31.3 - k8s.io/klog/v2 v2.130.1 ) require ( @@ -109,6 +105,7 @@ require ( github.com/cilium/stream v0.0.0-20240816054136-71321e385273 // indirect github.com/cilium/workerpool v1.2.0 // indirect github.com/containerd/cgroups/v3 v3.0.2 // indirect + github.com/containerd/containerd/api v1.8.0 // indirect github.com/containerd/errdefs v0.3.0 // indirect github.com/containerd/platforms v0.2.1 // indirect github.com/coreos/go-semver v0.3.1 // indirect @@ -191,8 +188,6 @@ require ( github.com/skeema/knownhosts v1.2.2 // indirect github.com/spdx/tools-golang v0.5.5 // indirect github.com/tchap/go-patricia/v2 v2.3.1 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.1 // indirect github.com/tklauser/numcpus v0.8.0 // indirect github.com/tonistiigi/go-csvvalue v0.0.0-20240710180619-ddb21b71c0b4 // indirect github.com/vishvananda/netlink v1.3.1-0.20241022031324-976bd8de7d81 // indirect @@ -219,6 +214,7 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/apiserver v0.31.2 // indirect k8s.io/component-base v0.31.2 // indirect + k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kubectl v0.31.2 // indirect knative.dev/pkg v0.0.0-20240805063731-c88d5dad9653 // indirect mvdan.cc/sh/v3 v3.10.0 // indirect diff --git a/go.sum b/go.sum index 99b4cfd1..eb9eb1fd 100644 --- a/go.sum +++ b/go.sum @@ -460,8 +460,6 @@ github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU= github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= -github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/containerd/typeurl/v2 v2.2.0 h1:6NBDbQzr7I5LHgp34xAXYF5DOTQDn05X58lsPEmzLso= github.com/containerd/typeurl/v2 v2.2.0/go.mod h1:8XOOxnyatxSWuG8OfsZXVnAF4iZfedjS/8UHSPJnX4g= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= @@ -1280,14 +1278,7 @@ github.com/tetratelabs/wazero v1.8.0 h1:iEKu0d4c2Pd+QSRieYbnQC9yiFlMS9D+Jr0LsRmc github.com/tetratelabs/wazero v1.8.0/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= github.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qvs5LdxRWqRI= github.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug= -github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= -github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= diff --git a/pkg/castai/client_test.go b/pkg/castai/client_test.go index 5bda8faf..791366c8 100644 --- a/pkg/castai/client_test.go +++ b/pkg/castai/client_test.go @@ -154,7 +154,7 @@ func (*testServer) KubernetesDeltaIngest(castaipb.RuntimeSecurityAgentAPI_Kubern panic("unimplemented") } -func (t *testServer) ContainerStatsWriteStream(server castaipb.RuntimeSecurityAgentAPI_ContainerStatsWriteStreamServer) error { +func (t *testServer) StatsWriteStream(server castaipb.RuntimeSecurityAgentAPI_StatsWriteStreamServer) error { //TODO implement me panic("implement me") } diff --git a/pkg/cgroup/cgroup.go b/pkg/cgroup/cgroup.go index bad85cbd..d319bb54 100644 --- a/pkg/cgroup/cgroup.go +++ b/pkg/cgroup/cgroup.go @@ -3,33 +3,97 @@ package cgroup import ( "os" "path" - "time" + "strings" - "k8s.io/klog/v2" + castaipb "github.com/castai/kvisor/api/v1/runtime" ) +const UnifiedMountpoint = "/sys/fs/cgroup" + +type Stats struct { + CpuStats *castaipb.CpuStats + MemoryStats *castaipb.MemoryStats + PidsStats *castaipb.PidsStats + IOStats *castaipb.IOStats +} + type Cgroup struct { Id uint64 - Version Version ContainerRuntime ContainerRuntimeID ContainerID string - Path string - subsystems map[string]string - cgRoot string + statsGetterFunc func(stats *Stats) error } -func (cg *Cgroup) CreatedAt() time.Time { - p := path.Join(cg.cgRoot, cg.subsystems[""]) //v2 - if cg.Version == V1 { - p = path.Join(cg.cgRoot, "cpu", cg.subsystems["cpu"]) +func (cg *Cgroup) GetStats() (Stats, error) { + res := Stats{ + CpuStats: &castaipb.CpuStats{}, + MemoryStats: &castaipb.MemoryStats{}, + PidsStats: &castaipb.PidsStats{}, + IOStats: &castaipb.IOStats{}, } - fi, err := os.Stat(p) - if err != nil { - if !os.IsNotExist(err) { - klog.Errorln(err) + if err := cg.statsGetterFunc(&res); err != nil { + if os.IsNotExist(err) { + return res, nil + } + return res, err + } + return res, nil +} + +func newCgroupStatsGetterFunc(version Version, psiEnabled bool, cgRootfsPath, cgPath string) func(stats *Stats) error { + switch version { + case V1: + after, _ := strings.CutPrefix(cgPath, cgRootfsPath) + subpath := strings.SplitN(after, "/", 1) + if len(subpath) != 2 { + return func(stats *Stats) error { + return nil + } } - return time.Time{} + last := subpath[1] + memBasePath := path.Join(cgRootfsPath, "memory", last) + cpuBasePath := path.Join(cgRootfsPath, "cpu", last) + pidsBasePath := path.Join(cgRootfsPath, "pids", last) + return func(stats *Stats) error { + if err := statMemoryV1(memBasePath, stats); err != nil { + return err + } + if err := statCpuV1(cpuBasePath, stats); err != nil { + return err + } + if err := statPidsV1(pidsBasePath, stats); err != nil { + return err + } + return nil + } + case V2: + return func(stats *Stats) error { + if err := statMemoryV2(cgPath, stats); err != nil { + return err + } + if err := statCpuV2(cgPath, stats); err != nil { + return err + } + if err := statPidsV2(cgPath, stats); err != nil { + return err + } + + if psiEnabled { + memPSI, _ := StatPSI(cgPath, "memory.pressure") + stats.MemoryStats.Psi = memPSI + + cpuPSI, _ := StatPSI(cgPath, "cpu.pressure") + stats.CpuStats.Psi = cpuPSI + + ioPSI, _ := StatPSI(cgPath, "io.pressure") + stats.IOStats.Psi = ioPSI + } + return nil + } + } + + return func(stats *Stats) error { + return nil } - return fi.ModTime() } diff --git a/pkg/cgroup/cgroup_cpu.go b/pkg/cgroup/cgroup_cpu.go index 588ac62c..c9f3aac9 100644 --- a/pkg/cgroup/cgroup_cpu.go +++ b/pkg/cgroup/cgroup_cpu.go @@ -1,86 +1,71 @@ package cgroup import ( - "fmt" + "bufio" "os" - "path" - "strconv" - "strings" ) -// See https://github.com/opencontainers/runc/tree/main/libcontainer/cgroups for more examples. +func statCpuV2(dirPath string, stats *Stats) error { + const file = "cpu.stat" + f, err := openFile(dirPath, file) + if err != nil { + return err + } + defer f.Close() -type CPUStat struct { - UsageSeconds float64 - ThrottledTimeSeconds float64 - LimitCores float64 -} + sc := bufio.NewScanner(f) + for sc.Scan() { + t, v, err := parseKeyValue(sc.Text()) + if err != nil { + return &parseError{Path: dirPath, File: file, Err: err} + } + switch t { + case "usage_usec": + stats.CpuStats.TotalUsage = v * 1000 -func (cg Cgroup) CpuStat() (*CPUStat, error) { - if cg.Version == V1 { - return cg.cpuStatV1() - } - return cg.cpuStatV2() -} + case "user_usec": + stats.CpuStats.UsageInUsermode = v * 1000 -func (cg Cgroup) cpuStatV1() (*CPUStat, error) { - throttling, err := readVariablesFromFile(path.Join(cg.cgRoot, "cpu", cg.subsystems["cpu"], "cpu.stat")) - if err != nil { - return nil, err - } - usageNs, err := readIntFromFile(path.Join(cg.cgRoot, "cpuacct", cg.subsystems["cpuacct"], "cpuacct.usage")) - if err != nil { - return nil, err - } - periodUs, err := readIntFromFile(path.Join(cg.cgRoot, "cpu", cg.subsystems["cpu"], "cpu.cfs_period_us")) - if err != nil { - return nil, err - } - quotaUs, err := readIntFromFile(path.Join(cg.cgRoot, "cpu", cg.subsystems["cpu"], "cpu.cfs_quota_us")) - if err != nil { - return nil, err - } - res := &CPUStat{ - UsageSeconds: float64(usageNs) / 1e9, - ThrottledTimeSeconds: float64(throttling["throttled_time"]) / 1e9, + case "system_usec": + stats.CpuStats.UsageInKernelmode = v * 1000 + + case "nr_throttled": + stats.CpuStats.ThrottledPeriods = v + + case "throttled_usec": + stats.CpuStats.ThrottledTime = v * 1000 + } } - if quotaUs > 0 { - res.LimitCores = float64(quotaUs) / float64(periodUs) + if err := sc.Err(); err != nil { + return &parseError{Path: dirPath, File: file, Err: err} } - return res, nil + return nil } -func (cg Cgroup) cpuStatV2() (*CPUStat, error) { - vars, err := readVariablesFromFile(path.Join(cg.cgRoot, cg.subsystems[""], "cpu.stat")) +func statCpuV1(dirPath string, stats *Stats) error { + const file = "cpu.stat" + f, err := openFile(dirPath, file) if err != nil { - return nil, err - } - res := &CPUStat{ - UsageSeconds: float64(vars["usage_usec"]) / 1e6, - ThrottledTimeSeconds: float64(vars["throttled_usec"]) / 1e6, - } - payload, err := os.ReadFile(path.Join(cg.cgRoot, cg.subsystems[""], "cpu.max")) - if err != nil { - return nil, err - } - data := strings.TrimSpace(string(payload)) - parts := strings.Fields(data) - if len(parts) != 2 { - return nil, fmt.Errorf("invalid cpu.max payload: %s", data) - } - if parts[0] == "max" { //no limit - return res, nil + if os.IsNotExist(err) { + return nil + } + return err } - quotaUs, err := strconv.ParseUint(parts[0], 10, 64) - if err != nil { - return nil, fmt.Errorf("invalid quota value in cpu.max: %s", parts[0]) - } - periodUs, err := strconv.ParseUint(parts[1], 10, 64) - if err != nil { - return nil, fmt.Errorf("invalid period value in cpu.max: %s", parts[1]) - } - if periodUs > 0 { - res.LimitCores = float64(quotaUs) / float64(periodUs) + defer f.Close() + + sc := bufio.NewScanner(f) + for sc.Scan() { + t, v, err := parseKeyValue(sc.Text()) + if err != nil { + return &parseError{Path: dirPath, File: file, Err: err} + } + switch t { + case "nr_throttled": + stats.CpuStats.ThrottledPeriods = v + + case "throttled_time": + stats.CpuStats.ThrottledTime = v + } } - return res, nil + return nil } diff --git a/pkg/cgroup/cgroup_cpu_test.go b/pkg/cgroup/cgroup_cpu_test.go deleted file mode 100644 index 84a35dab..00000000 --- a/pkg/cgroup/cgroup_cpu_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package cgroup - -import ( - "path" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func init() { - baseCgroupPath = "fixtures/cgroup" -} - -func TestCgroup_CpuStat(t *testing.T) { - t.Skip() // TODO: Fix tests after NewFromProcessCgroupFile is used. - - cg, err := NewFromProcessCgroupFile(path.Join("fixtures/proc/100/cgroup")) - require.NoError(t, err) - s, err := cg.CpuStat() - assert.Nil(t, err) - assert.Equal(t, 0., s.LimitCores) - assert.Equal(t, 26778.913419246, s.UsageSeconds) - - cg, _ = NewFromProcessCgroupFile(path.Join("fixtures/proc/200/cgroup")) - s, err = cg.CpuStat() - assert.Nil(t, err) - assert.Equal(t, 1.5, s.LimitCores) - assert.Equal(t, 254005.032764376, s.ThrottledTimeSeconds) - - cg, _ = NewFromProcessCgroupFile(path.Join("fixtures/proc/400/cgroup")) - s, err = cg.CpuStat() - assert.Nil(t, err) - assert.Equal(t, 0.1, s.LimitCores) - assert.Equal(t, 0.363166, s.ThrottledTimeSeconds) - assert.Equal(t, 3795.681254, s.UsageSeconds) - - cg, _ = NewFromProcessCgroupFile(path.Join("fixtures/proc/500/cgroup")) - s, err = cg.CpuStat() - assert.Nil(t, err) - assert.Equal(t, 0., s.LimitCores) - assert.Equal(t, 0., s.ThrottledTimeSeconds) - assert.Equal(t, 5531.521992, s.UsageSeconds) -} diff --git a/pkg/cgroup/cgroup_io.go b/pkg/cgroup/cgroup_io.go index 515bbfc5..00739136 100644 --- a/pkg/cgroup/cgroup_io.go +++ b/pkg/cgroup/cgroup_io.go @@ -1,123 +1,96 @@ package cgroup -import ( - "os" - "path" - "strconv" - "strings" - - "k8s.io/klog/v2" -) - -type IOStat struct { - ReadOps uint64 - WriteOps uint64 - ReadBytes uint64 - WrittenBytes uint64 -} - -func (cg *Cgroup) IOStat() (map[string]IOStat, error) { - if cg.Version == V1 { - return cg.ioStatV1() - } - return cg.ioStatV2() -} - -func (cg *Cgroup) ioStatV1() (map[string]IOStat, error) { - ops, err := readBlkioStatFile(path.Join(cg.cgRoot, "blkio", cg.subsystems["blkio"], "blkio.throttle.io_serviced")) - if err != nil { - return nil, err - } - bytes, err := readBlkioStatFile(path.Join(cg.cgRoot, "blkio", cg.subsystems["blkio"], "blkio.throttle.io_service_bytes")) - if err != nil { - return nil, err - } - res := map[string]IOStat{} - for _, v := range ops { - stat := res[v.majorMinor] - switch v.name { - case "Read": - stat.ReadOps = v.value - case "Write": - stat.WriteOps = v.value - } - res[v.majorMinor] = stat - } - for _, v := range bytes { - stat := res[v.majorMinor] - switch v.name { - case "Read": - stat.ReadBytes = v.value - case "Write": - stat.WrittenBytes = v.value - } - res[v.majorMinor] = stat - } - return res, nil -} - -func (cg *Cgroup) ioStatV2() (map[string]IOStat, error) { - payload, err := os.ReadFile(path.Join(cg.cgRoot, cg.subsystems[""], "io.stat")) - if err != nil { - return nil, err - } - res := map[string]IOStat{} - for _, line := range strings.Split(string(payload), "\n") { - parts := strings.Fields(line) - if len(parts) < 5 { - continue - } - s := IOStat{} - for _, value := range parts[1:] { - if kv := strings.SplitN(value, "=", 2); len(kv) == 2 { - v, err := strconv.ParseUint(kv[1], 10, 64) - if err != nil { - continue - } - switch kv[0] { - case "rbytes": - s.ReadBytes = v - case "wbytes": - s.WrittenBytes = v - case "rios": - s.ReadOps = v - case "wios": - s.WriteOps = v - } - } - } - res[parts[0]] = s - } - return res, nil -} - -type blkioVariable struct { - majorMinor string - name string - value uint64 -} - -func readBlkioStatFile(filePath string) ([]blkioVariable, error) { - data, err := os.ReadFile(filePath) - if err != nil { - return nil, err - } - var res []blkioVariable - for _, line := range strings.Split(string(data), "\n") { - parts := strings.Fields(line) - if len(parts) != 3 { - continue - } - v, err := strconv.ParseUint(parts[2], 10, 64) - if err != nil { - klog.Warningf(`failed to parse blkio stat line "%s": %s`, line, err) - continue - } - res = append(res, blkioVariable{ - majorMinor: parts[0], - name: parts[1], - value: v, - }) - } - return res, nil -} +// TODO: Implement IO stats later. +//func statIOV2(dirPath string, stats *Stats) error { +// const file = "io.stat" +// values, err := readCgroup2MapFile(dirPath, file) +// if err != nil { +// return err +// } +// // more details on the io.stat file format: https://www.kernel.org/doc/Documentation/cgroup-v2.txt +// var parsedStats BlkioStats +// for k, v := range values { +// d := strings.Split(k, ":") +// if len(d) != 2 { +// continue +// } +// major, err := strconv.ParseUint(d[0], 10, 64) +// if err != nil { +// return &parseError{Path: dirPath, File: file, Err: err} +// } +// minor, err := strconv.ParseUint(d[1], 10, 64) +// if err != nil { +// return &parseError{Path: dirPath, File: file, Err: err} +// } +// +// for _, item := range v { +// d := strings.Split(item, "=") +// if len(d) != 2 { +// continue +// } +// op := d[0] +// +// // Map to the cgroupv1 naming and layout (in separate tables). +// var targetTable *[]BlkioStatEntry +// switch op { +// // Equivalent to cgroupv1's blkio.io_service_bytes. +// case "rbytes": +// op = "Read" +// targetTable = &parsedStats.IoServiceBytesRecursive +// case "wbytes": +// op = "Write" +// targetTable = &parsedStats.IoServiceBytesRecursive +// // Equivalent to cgroupv1's blkio.io_serviced. +// case "rios": +// op = "Read" +// targetTable = &parsedStats.IoServicedRecursive +// case "wios": +// op = "Write" +// targetTable = &parsedStats.IoServicedRecursive +// default: +// // Skip over entries we cannot map to cgroupv1 stats for now. +// // In the future we should expand the stats struct to include +// // them. +// logrus.Debugf("cgroupv2 io stats: skipping over unmappable %s entry", item) +// continue +// } +// +// value, err := strconv.ParseUint(d[1], 10, 64) +// if err != nil { +// return &parseError{Path: dirPath, File: file, Err: err} +// } +// +// entry := BlkioStatEntry{ +// Op: op, +// Major: major, +// Minor: minor, +// Value: value, +// } +// *targetTable = append(*targetTable, entry) +// } +// } +// stats.BlkioStats = parsedStats +// return nil +//} +// +//func readCgroup2MapFile(dirPath string, name string) (map[string][]string, error) { +// ret := map[string][]string{} +// f, err := cgroups.OpenFile(dirPath, name, os.O_RDONLY) +// if err != nil { +// return nil, err +// } +// defer f.Close() +// scanner := bufio.NewScanner(f) +// for scanner.Scan() { +// line := scanner.Text() +// parts := strings.Fields(line) +// if len(parts) < 2 { +// continue +// } +// ret[parts[0]] = parts[1:] +// } +// if err := scanner.Err(); err != nil { +// return nil, &parseError{Path: dirPath, File: name, Err: err} +// } +// return ret, nil +//} diff --git a/pkg/cgroup/cgroup_io_test.go b/pkg/cgroup/cgroup_io_test.go deleted file mode 100644 index 0f81ca20..00000000 --- a/pkg/cgroup/cgroup_io_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package cgroup - -import ( - "path" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestCgroup_IOStat(t *testing.T) { - t.Skip() // TODO: Fix tests after NewFromProcessCgroupFile is used. - - cg, _ := NewFromProcessCgroupFile(path.Join("fixtures/proc/200/cgroup")) - stat, err := cg.IOStat() - assert.Nil(t, err) - assert.Equal(t, - map[string]IOStat{ - "8:0": {ReadOps: 0, WriteOps: 281, ReadBytes: 0, WrittenBytes: 4603904}, - "8:16": {ReadOps: 0, WriteOps: 39, ReadBytes: 0, WrittenBytes: 655360}, - "8:32": {ReadOps: 23043666, WriteOps: 28906992, ReadBytes: 998632854016, WrittenBytes: 884175858688}, - "8:48": {ReadOps: 20689345, WriteOps: 27906791, ReadBytes: 875529547776, WrittenBytes: 753046432768}, - "9:1": {ReadOps: 633949, WriteOps: 4, ReadBytes: 10238894080, WrittenBytes: 49152}, - }, - stat) - - cg, _ = NewFromProcessCgroupFile(path.Join("fixtures/proc/400/cgroup")) - stat, err = cg.IOStat() - assert.Nil(t, err) - assert.Equal(t, - map[string]IOStat{ - "252:0": {ReadOps: 22, WriteOps: 57111, ReadBytes: 11, WrittenBytes: 630538240}, - "253:0": {ReadOps: 44, WriteOps: 57056, ReadBytes: 33, WrittenBytes: 630538241}, - }, - stat) - -} diff --git a/pkg/cgroup/cgroup_linux.go b/pkg/cgroup/cgroup_linux.go deleted file mode 100644 index 58858994..00000000 --- a/pkg/cgroup/cgroup_linux.go +++ /dev/null @@ -1,41 +0,0 @@ -package cgroup - -import ( - "github.com/vishvananda/netns" - "golang.org/x/sys/unix" - "runtime" -) - -func Init() error { - selfNs, err := netns.GetFromPath("/proc/self/ns/cgroup") - if err != nil { - return err - } - defer selfNs.Close() - hostNs, err := netns.GetFromPath("/proc/1/ns/cgroup") - if err != nil { - return err - } - defer hostNs.Close() - if selfNs.Equal(hostNs) { - return nil - } - - runtime.LockOSThread() - defer runtime.UnlockOSThread() - if err := unix.Setns(int(hostNs), unix.CLONE_NEWCGROUP); err != nil { - return err - } - - cg, err := NewFromProcessCgroupFile("/proc/self/cgroup") - if err != nil { - return err - } - baseCgroupPath = cg.Path - - if err := unix.Setns(int(selfNs), unix.CLONE_NEWCGROUP); err != nil { - return err - } - - return nil -} diff --git a/pkg/cgroup/cgroup_memory.go b/pkg/cgroup/cgroup_memory.go index df044f33..c8fb1613 100644 --- a/pkg/cgroup/cgroup_memory.go +++ b/pkg/cgroup/cgroup_memory.go @@ -1,64 +1,154 @@ package cgroup import ( - "path" + "bufio" + "errors" + "os" + + castaipb "github.com/castai/kvisor/api/v1/runtime" + "golang.org/x/sys/unix" ) -const maxMemory = 1 << 62 +func statMemoryV2(dirPath string, stats *Stats) error { + const file = "memory.stat" + statsFile, err := openFile(dirPath, file) + if err != nil { + return err + } + defer statsFile.Close() -type MemoryStat struct { - RSS uint64 - Cache uint64 - Limit uint64 -} + sc := bufio.NewScanner(statsFile) + for sc.Scan() { + t, v, err := parseKeyValue(sc.Text()) + if err != nil { + return &parseError{Path: dirPath, File: file, Err: err} + } + if t == "file" { + stats.MemoryStats.Cache = v + } + } + if err := sc.Err(); err != nil { + return &parseError{Path: dirPath, File: file, Err: err} + } -func (cg *Cgroup) MemoryStat() (*MemoryStat, error) { - if cg.Version == V1 { - return cg.memoryStatV1() + memoryUsage, err := getMemoryDataV2(dirPath, "") + if err != nil { + if errors.Is(err, unix.ENOENT) && dirPath == UnifiedMountpoint { + // The root cgroup does not have memory.{current,max,peak} + return nil + } + return err + } + stats.MemoryStats.Usage = memoryUsage + swapOnlyUsage, err := getMemoryDataV2(dirPath, "swap") + if err != nil { + return err } - return cg.memoryStatV2() + stats.MemoryStats.SwapOnlyUsage = swapOnlyUsage + + return nil } -func (cg *Cgroup) memoryStatV1() (*MemoryStat, error) { - vars, err := readVariablesFromFile(path.Join(cg.cgRoot, "memory", cg.subsystems["memory"], "memory.stat")) +func getMemoryDataV2(path, name string) (*castaipb.MemoryData, error) { + memoryData := castaipb.MemoryData{} + + moduleName := "memory" + if name != "" { + moduleName = "memory." + name + } + usage := moduleName + ".current" + limit := moduleName + ".max" + + value, err := getCgroupParamUint(path, usage) if err != nil { + if name != "" && os.IsNotExist(err) { + // Ignore EEXIST as there's no swap accounting + // if kernel CONFIG_MEMCG_SWAP is not set or + // swapaccount=0 kernel boot parameter is given. + return &memoryData, nil + } return nil, err } - limit, err := readUintFromFile(path.Join(cg.cgRoot, "memory", cg.subsystems["memory"], "memory.limit_in_bytes")) + memoryData.Usage = value + + value, err = getCgroupParamUint(path, limit) if err != nil { return nil, err } - if limit > maxMemory { - limit = 0 - } - // Note from https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt: - // Only anonymous and swap cache memory is listed as part of 'rss' stat. - // This should not be confused with the true 'resident set size' or the - // amount of physical memory used by the cgroup. - // 'rss + mapped_file" will give you resident set size of cgroup. - // (Note: file and shmem may be shared among other cgroups. In that case, - // mapped_file is accounted only when the memory cgroup is owner of page - // cache.) - return &MemoryStat{ - RSS: vars["rss"] + vars["mapped_file"], - Cache: vars["cache"], - Limit: limit, - }, nil + memoryData.Limit = value + return &memoryData, nil } -func (cg *Cgroup) memoryStatV2() (*MemoryStat, error) { - current, err := readUintFromFile(path.Join(cg.cgRoot, cg.subsystems[""], "memory.current")) +func statMemoryV1(dirPath string, stats *Stats) error { + const file = "memory.stat" + statsFile, err := openFile(dirPath, file) if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + defer statsFile.Close() + + sc := bufio.NewScanner(statsFile) + for sc.Scan() { + t, v, err := parseKeyValue(sc.Text()) + if err != nil { + return &parseError{Path: dirPath, File: file, Err: err} + } + if t == "cache" { + stats.MemoryStats.Cache = v + } + } + + memoryUsage, err := getMemoryDataV1(dirPath, "") + if err != nil { + return err + } + stats.MemoryStats.Usage = memoryUsage + swapUsage, err := getMemoryDataV1(dirPath, "memsw") + if err != nil { + return err + } + stats.MemoryStats.SwapOnlyUsage = &castaipb.MemoryData{ + Usage: swapUsage.Usage - memoryUsage.Usage, + } + return nil +} + +func getMemoryDataV1(path, name string) (*castaipb.MemoryData, error) { + memoryData := castaipb.MemoryData{} + + moduleName := "memory" + if name != "" { + moduleName = "memory." + name + } + var ( + usage = moduleName + ".usage_in_bytes" + limit = moduleName + ".limit_in_bytes" + ) + + value, err := getCgroupParamUint(path, usage) + if err != nil { + if name != "" && os.IsNotExist(err) { + // Ignore ENOENT as swap and kmem controllers + // are optional in the kernel. + return &memoryData, nil + } return nil, err } - vars, err := readVariablesFromFile(path.Join(cg.cgRoot, cg.subsystems[""], "memory.stat")) + memoryData.Usage = value + value, err = getCgroupParamUint(path, limit) if err != nil { + if name == "kmem" && os.IsNotExist(err) { + // Ignore ENOENT as kmem.limit_in_bytes has + // been removed in newer kernels. + return &memoryData, nil + } + return nil, err } - limit, _ := readUintFromFile(path.Join(cg.cgRoot, cg.subsystems[""], "memory.max")) - return &MemoryStat{ - RSS: current - vars["file"], - Cache: vars["file"], - Limit: limit, - }, nil + memoryData.Limit = value + + return &memoryData, nil } diff --git a/pkg/cgroup/cgroup_memory_test.go b/pkg/cgroup/cgroup_memory_test.go deleted file mode 100644 index cf781b1c..00000000 --- a/pkg/cgroup/cgroup_memory_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package cgroup - -import ( - "path" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestCgroup_MemoryStat(t *testing.T) { - t.Skip() // TODO: Fix tests after NewFromProcessCgroupFile is used. - - cg, _ := NewFromProcessCgroupFile(path.Join("fixtures/proc/100/cgroup")) - stat, err := cg.MemoryStat() - assert.Nil(t, err) - assert.Equal(t, uint64(0), stat.Limit) - - cg, _ = NewFromProcessCgroupFile(path.Join("fixtures/proc/200/cgroup")) - stat, err = cg.MemoryStat() - assert.Nil(t, err) - assert.Equal(t, uint64(14775123968), stat.RSS) - assert.Equal(t, uint64(3206844416), stat.Cache) - assert.Equal(t, uint64(21474836480), stat.Limit) - - cg, _ = NewFromProcessCgroupFile(path.Join("fixtures/proc/400/cgroup")) - stat, err = cg.MemoryStat() - assert.Nil(t, err) - assert.Equal(t, uint64(48648192-1044480), stat.RSS) - assert.Equal(t, uint64(1044480), stat.Cache) - assert.Equal(t, uint64(0), stat.Limit) - - cg, _ = NewFromProcessCgroupFile(path.Join("fixtures/proc/500/cgroup")) - stat, err = cg.MemoryStat() - assert.Nil(t, err) - assert.Equal(t, uint64(131047424-50835456), stat.RSS) - assert.Equal(t, uint64(50835456), stat.Cache) - assert.Equal(t, uint64(4294967296), stat.Limit) - -} diff --git a/pkg/cgroup/cgroup_pids.go b/pkg/cgroup/cgroup_pids.go new file mode 100644 index 00000000..b1b36e3a --- /dev/null +++ b/pkg/cgroup/cgroup_pids.go @@ -0,0 +1,76 @@ +package cgroup + +import ( + "errors" + "math" + "os" + "strings" + + "golang.org/x/sys/unix" +) + +func statPidsV2(dirPath string, stats *Stats) error { + current, err := getCgroupParamUint(dirPath, "pids.current") + if err != nil { + if os.IsNotExist(err) { + return statPidsFromCgroupProcs(dirPath, stats) + } + return err + } + + maxVal, err := getCgroupParamUint(dirPath, "pids.max") + if err != nil { + return err + } + // If no limit is set, read from pids.max returns "max", which is + // converted to MaxUint64 by GetCgroupParamUint. Historically, we + // represent "no limit" for pids as 0, thus this conversion. + if maxVal == math.MaxUint64 { + maxVal = 0 + } + + stats.PidsStats.Current = current + stats.PidsStats.Limit = maxVal + return nil +} + +func statPidsFromCgroupProcs(dirPath string, stats *Stats) error { + // if the controller is not enabled, let's read PIDS from cgroups.procs + // (or threads if cgroup.threads is enabled) + contents, err := readCgroupFile(dirPath, "cgroup.procs") + if errors.Is(err, unix.ENOTSUP) { + contents, err = readCgroupFile(dirPath, "cgroup.threads") + } + if err != nil { + return err + } + pids := strings.Count(contents, "\n") + stats.PidsStats.Current = uint64(pids) + stats.PidsStats.Limit = 0 + return nil +} + +func statPidsV1(path string, stats *Stats) error { + if !pathExists(path) { + return nil + } + current, err := getCgroupParamUint(path, "pids.current") + if err != nil { + return err + } + + maxVal, err := getCgroupParamUint(path, "pids.max") + if err != nil { + return err + } + // If no limit is set, read from pids.max returns "max", which is + // converted to MaxUint64 by GetCgroupParamUint. Historically, we + // represent "no limit" for pids as 0, thus this conversion. + if maxVal == math.MaxUint64 { + maxVal = 0 + } + + stats.PidsStats.Current = current + stats.PidsStats.Limit = maxVal + return nil +} diff --git a/pkg/cgroup/client.go b/pkg/cgroup/client.go index 84263414..f45d4825 100644 --- a/pkg/cgroup/client.go +++ b/pkg/cgroup/client.go @@ -6,7 +6,6 @@ import ( "fmt" "io/fs" "os" - "path" "path/filepath" "regexp" "strconv" @@ -19,10 +18,7 @@ import ( ) var ( - baseCgroupPath = "" - - ErrContainerIDNotFoundInCgroupPath = errors.New("container id not found in cgroup path") - ErrCgroupNotFound = errors.New("cgroup not found") + ErrCgroupNotFound = errors.New("cgroup not found") ) type ID = uint64 @@ -101,9 +97,10 @@ type Client struct { cgroupCacheByID map[ID]func() *Cgroup cgroupMu sync.RWMutex defaultHierarchyID uint32 + psiEnabled bool } -func NewClient(log *logging.Logger, root string) (*Client, error) { +func NewClient(log *logging.Logger, root string, psiEnabled bool) (*Client, error) { version, defaultHierarchyID, err := getDefaultVersionAndHierarchy(log) if err != nil { return nil, fmt.Errorf("getting default cgroups version: %w", err) @@ -114,6 +111,7 @@ func NewClient(log *logging.Logger, root string) (*Client, error) { cgRoot: root, cgroupCacheByID: make(map[uint64]func() *Cgroup), defaultHierarchyID: defaultHierarchyID, + psiEnabled: psiEnabled, }, nil } @@ -154,38 +152,12 @@ func (c *Client) GetCgroupForID(cgroupID ID) (*Cgroup, error) { func (c *Client) getCgroupForIDAndPath(cgroupID ID, cgroupPath string) *Cgroup { containerID, containerRuntime := GetContainerIdFromCgroup(cgroupPath) - cg := &Cgroup{ + return &Cgroup{ Id: cgroupID, ContainerID: containerID, ContainerRuntime: containerRuntime, - Path: cgroupPath, - cgRoot: c.cgRoot, - subsystems: map[string]string{}, + statsGetterFunc: newCgroupStatsGetterFunc(c.version, c.psiEnabled, c.cgRoot, cgroupPath), } - - switch c.version { - case V1: - after, _ := strings.CutPrefix(cgroupPath, cg.cgRoot) - subpath := strings.SplitN(after, "/", 1) - if len(subpath) != 2 { - return cg - } - last := subpath[1] - cg.Version = V1 - cg.subsystems = map[string]string{ - "cpu": last, - "cpuacct": last, - "memory": last, - "blkio": last, - } - case V2: - after, _ := strings.CutPrefix(cgroupPath, cg.cgRoot) - cg.Version = V2 - cg.subsystems = map[string]string{ - "": after, - } - } - return cg } func (c *Client) getCgroupSearchBasePath() string { @@ -314,47 +286,6 @@ func isCgroupV2MountedAndDefault() (bool, error) { return true, nil } -func NewFromProcessCgroupFile(filePath string) (*Cgroup, error) { - data, err := os.ReadFile(filePath) - if err != nil { - return nil, err - } - cg := &Cgroup{ - subsystems: map[string]string{}, - cgRoot: baseCgroupPath, - } - for _, line := range strings.Split(string(data), "\n") { - parts := strings.SplitN(line, ":", 3) - if len(parts) < 3 { - continue - } - for _, cgType := range strings.Split(parts[1], ",") { - cg.subsystems[cgType] = path.Join(baseCgroupPath, parts[2]) - } - } - - if p := cg.subsystems["cpu"]; p != "" { - cg.Path = p - cg.Version = V1 - } else { - cg.Path = cg.subsystems[""] - cg.Version = V2 - } - - if containerID, runtimeType := GetContainerIdFromCgroup(cg.Path); containerID == "" { - return nil, ErrContainerIDNotFoundInCgroupPath - } else { - cg.ContainerID = containerID - cg.ContainerRuntime = runtimeType - } - - if cg.Id, err = getCgroupIDForPath(cg.Path); err != nil { - return nil, err - } - - return cg, nil -} - var ( containerIdFromCgroupRegex = regexp.MustCompile(`^[A-Fa-f0-9]{64}$`) gardenContainerIdFromCgroupRegex = regexp.MustCompile(`^[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){4}$`) @@ -427,15 +358,6 @@ func GetContainerIdFromCgroup(cgroupPath string) (string, ContainerRuntimeID) { return "", UnknownRuntime } -func getCgroupIDForPath(path string) (ID, error) { - // Lower 32 bits of the cgroup id == inode number of matching cgroupfs entry - var stat syscall.Stat_t - if err := syscall.Stat(path, &stat); err != nil { - return 0, err - } - return stat.Ino, nil -} - func (c *Client) LoadCgroup(id ID, path string) { c.cgroupMu.Lock() defer c.cgroupMu.Unlock() diff --git a/pkg/cgroup/client_test.go b/pkg/cgroup/client_test.go index 4fc6a5db..f3e50b78 100644 --- a/pkg/cgroup/client_test.go +++ b/pkg/cgroup/client_test.go @@ -1,75 +1,12 @@ package cgroup import ( - "path" "syscall" "testing" "github.com/stretchr/testify/assert" ) -func TestNewFromProcessCgroupFile(t *testing.T) { - t.Skip() // TODO: Fix tests after NewFromProcessCgroupFile is used. - - cg, err := NewFromProcessCgroupFile(path.Join("fixtures/proc/100/cgroup")) - assert.Nil(t, err) - assert.Equal(t, "/system.slice/docker.service", cg.Id) - assert.Equal(t, V1, cg.Version) - assert.Equal(t, "/system.slice/docker.service", cg.ContainerID) - assert.Equal(t, DockerRuntime, cg.ContainerRuntime) - - assert.Equal(t, - map[string]string{ - "blkio": "/system.slice/docker.service", - "cpu": "/system.slice/docker.service", - "cpuacct": "/system.slice/docker.service", - "cpuset": "/", - "devices": "/system.slice/docker.service", - "freezer": "/", - "hugetlb": "/", - "memory": "/system.slice/docker.service", - "name=systemd": "/system.slice/docker.service", - "net_cls": "/", - "net_prio": "/", - "perf_event": "/", - "pids": "/system.slice/docker.service", - }, - cg.subsystems, - ) - - cg, err = NewFromProcessCgroupFile(path.Join("fixtures/proc/200/cgroup")) - assert.Nil(t, err) - assert.Equal(t, V1, cg.Version) - assert.Equal(t, "/docker/b43d92bf1e5c6f78bb9b7bc6f40721280299855ba692092716e3a1b6c0b86f3f", cg.Id) - assert.Equal(t, "b43d92bf1e5c6f78bb9b7bc6f40721280299855ba692092716e3a1b6c0b86f3f", cg.ContainerID) - assert.Equal(t, DockerRuntime, cg.ContainerRuntime) - - cg, err = NewFromProcessCgroupFile(path.Join("fixtures/proc/300/cgroup")) - assert.Nil(t, err) - assert.Equal(t, V1, cg.Version) - assert.Equal(t, "/kubepods/burstable/pod6a4ce4a0-ba47-11ea-b2a7-0cc47ac5979e/17db96a24ae1e9dd57143e62b1cb0d2d35e693c65c774c7470e87b0572e07c1a", cg.Id) - assert.Equal(t, "17db96a24ae1e9dd57143e62b1cb0d2d35e693c65c774c7470e87b0572e07c1a", cg.ContainerID) - assert.Equal(t, DockerRuntime, cg.ContainerRuntime) - - cg, err = NewFromProcessCgroupFile(path.Join("fixtures/proc/400/cgroup")) - assert.Nil(t, err) - assert.Equal(t, V2, cg.Version) - assert.Equal(t, "/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod8712f785_1a3e_41ec_a00b_e2dcc77431cb.slice/docker-73051af271105c07e1f493b34856a77e665e3b0b4fc72f76c807dfbffeb881bd.scope", cg.Id) - assert.Equal(t, "73051af271105c07e1f493b34856a77e665e3b0b4fc72f76c807dfbffeb881bd", cg.ContainerID) - assert.Equal(t, DockerRuntime, cg.ContainerRuntime) - - baseCgroupPath = "/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc83d0428_58af_41eb_8dba_b9e6eddffe7b.slice/docker-0e612005fd07e7f47e2cd07df99a2b4e909446814d71d0b5e4efc7159dd51252.scope" - defer func() { - baseCgroupPath = "" - }() - cg, err = NewFromProcessCgroupFile(path.Join("fixtures/proc/500/cgroup")) - assert.Nil(t, err) - assert.Equal(t, V2, cg.Version) - assert.Equal(t, "/system.slice/docker-ba7b10d15d16e10e3de7a2dcd408a3d971169ae303f46cfad4c5453c6326fee2.scope", cg.Id) - assert.Equal(t, "ba7b10d15d16e10e3de7a2dcd408a3d971169ae303f46cfad4c5453c6326fee2", cg.ContainerID) - assert.Equal(t, DockerRuntime, cg.ContainerRuntime) -} - func TestContainerByCgroup(t *testing.T) { as := assert.New(t) diff --git a/pkg/cgroup/psi.go b/pkg/cgroup/psi.go new file mode 100644 index 00000000..baad4945 --- /dev/null +++ b/pkg/cgroup/psi.go @@ -0,0 +1,75 @@ +package cgroup + +import ( + "bufio" + "errors" + "fmt" + "os" + "strconv" + "strings" + + castaipb "github.com/castai/kvisor/api/v1/runtime" + "golang.org/x/sys/unix" +) + +func StatPSI(dirPath string, file string) (*castaipb.PSIStats, error) { + f, err := openFile(dirPath, file) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + // Kernel < 4.20, or CONFIG_PSI is not set, + // or PSI stats are turned off for the cgroup + // ("echo 0 > cgroup.pressure", kernel >= 6.1). + return nil, nil + } + return nil, err + } + defer f.Close() + + var psistats castaipb.PSIStats + sc := bufio.NewScanner(f) + for sc.Scan() { + parts := strings.Fields(sc.Text()) + switch parts[0] { + case "some": + psistats.Some, err = parsePSIData(parts[1:]) + if err != nil { + return nil, &parseError{Path: dirPath, File: file, Err: err} + } + case "full": + psistats.Full, err = parsePSIData(parts[1:]) + if err != nil { + return nil, &parseError{Path: dirPath, File: file, Err: err} + } + } + } + if err := sc.Err(); err != nil { + if errors.Is(err, unix.ENOTSUP) { + // Some kernels (e.g. CS9) may return ENOTSUP on read + // if psi=1 kernel cmdline parameter is required. + return nil, nil + } + return nil, &parseError{Path: dirPath, File: file, Err: err} + } + return &psistats, nil +} + +func parsePSIData(psi []string) (*castaipb.PSIData, error) { + data := castaipb.PSIData{} + for _, f := range psi { + kv := strings.SplitN(f, "=", 2) + if len(kv) != 2 { + return nil, fmt.Errorf("invalid psi data: %q", f) + } + switch kv[0] { + case "total": + v, err := strconv.ParseUint(kv[1], 10, 64) + if err != nil { + return nil, fmt.Errorf("invalid %s PSI value: %w", kv[0], err) + } + data.Total = v + // For now we care only about total value. + return &data, nil + } + } + return &data, nil +} diff --git a/pkg/cgroup/utils.go b/pkg/cgroup/utils.go index aaa14ab4..e340a96c 100644 --- a/pkg/cgroup/utils.go +++ b/pkg/cgroup/utils.go @@ -1,45 +1,99 @@ package cgroup import ( + "errors" + "fmt" + "math" "os" + "path" "strconv" "strings" - - "k8s.io/klog/v2" ) -func readVariablesFromFile(filePath string) (map[string]uint64, error) { - data, err := os.ReadFile(filePath) +type parseError struct { + Path string + File string + Err error +} + +func (e *parseError) Error() string { + return "unable to parse " + path.Join(e.Path, e.File) + ": " + e.Err.Error() +} + +func (e *parseError) Unwrap() error { return e.Err } + +func parseKeyValue(t string) (string, uint64, error) { + parts := strings.SplitN(t, " ", 3) + if len(parts) != 2 { + return "", 0, fmt.Errorf("line %q is not in key value format", t) + } + + value, err := parseUint(parts[1], 10, 64) if err != nil { - return nil, err - } - res := map[string]uint64{} - for _, line := range strings.Split(string(data), "\n") { - parts := strings.Fields(line) - if len(parts) == 2 { - v, err := strconv.ParseUint(parts[1], 10, 64) - if err != nil { - klog.Warningf(`failed to parse cgroup stat line "%s": %s`, line, err) - continue - } - res[parts[0]] = v + return "", 0, err + } + + return parts[0], value, nil +} + +func parseUint(s string, base, bitSize int) (uint64, error) { + value, err := strconv.ParseUint(s, base, bitSize) + if err != nil { + intValue, intErr := strconv.ParseInt(s, base, bitSize) + // 1. Handle negative values greater than MinInt64 (and) + // 2. Handle negative values lesser than MinInt64 + if intErr == nil && intValue < 0 { + return 0, nil + } else if errors.Is(intErr, strconv.ErrRange) && intValue < 0 { + return 0, nil } + + return value, err } - return res, nil + + return value, nil } -func readIntFromFile(filePath string) (int64, error) { - data, err := os.ReadFile(filePath) +func openFile(dirPath, fileName string) (*os.File, error) { + return os.OpenFile(path.Join(dirPath, fileName), os.O_RDONLY, 0o600) +} + +func readCgroupFile(dirPath, fileName string) (string, error) { + data, err := os.ReadFile(path.Join(dirPath, fileName)) if err != nil { - return 0, err + return "", err } - return strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64) + return string(data), nil } -func readUintFromFile(filePath string) (uint64, error) { - data, err := os.ReadFile(filePath) +func getCgroupParamUint(path, file string) (uint64, error) { + contents, err := getCgroupParamString(path, file) if err != nil { return 0, err } - return strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64) + contents = strings.TrimSpace(contents) + if contents == "max" { + return math.MaxUint64, nil + } + + res, err := parseUint(contents, 10, 64) + if err != nil { + return res, &parseError{Path: path, File: file, Err: err} + } + return res, nil +} + +func getCgroupParamString(path, file string) (string, error) { + contents, err := readCgroupFile(path, file) + if err != nil { + return "", err + } + return strings.TrimSpace(contents), nil +} + +func pathExists(path string) bool { + if _, err := os.Stat(path); err != nil { + return false + } + return true } diff --git a/pkg/containers/client.go b/pkg/containers/client.go index 54d420eb..996a4fb2 100644 --- a/pkg/containers/client.go +++ b/pkg/containers/client.go @@ -12,7 +12,6 @@ import ( "github.com/castai/kvisor/pkg/cgroup" "github.com/castai/kvisor/pkg/logging" "github.com/castai/kvisor/pkg/proc" - "github.com/samber/lo" criapi "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -120,9 +119,15 @@ func (c *Client) LoadContainerTasks(ctx context.Context) ([]ContainerProcess, er func (c *Client) ListContainers() []*Container { c.mu.RLock() defer c.mu.RUnlock() - return lo.Filter(lo.Values(c.containersByCgroup), func(item *Container, index int) bool { - return item.Err == nil && item.Cgroup != nil - }) + + var res []*Container + for _, cont := range c.containersByCgroup { + if cont.Err != nil || cont.Cgroup == nil || cont.Name == "" { + continue + } + res = append(res, cont) + } + return res } func (c *Client) AddContainerByCgroupID(ctx context.Context, cgroupID cgroup.ID) (cont *Container, rerrr error) { @@ -296,9 +301,9 @@ func (c *Client) GetCgroupsInNamespace(namespace string) []uint64 { var result []uint64 - for cgroup, container := range c.containersByCgroup { + for cg, container := range c.containersByCgroup { if container.PodNamespace == namespace { - result = append(result, cgroup) + result = append(result, cg) } } @@ -339,10 +344,6 @@ func (c *Client) fireContainerDeletedListeners(container *Container) { } } -func (c *Client) GetCgroupCpuStats(cont *Container) (*cgroup.CPUStat, error) { - return cont.Cgroup.CpuStat() -} - -func (c *Client) GetCgroupMemoryStats(cont *Container) (*cgroup.MemoryStat, error) { - return cont.Cgroup.MemoryStat() +func (c *Client) GetCgroupStats(cont *Container) (cgroup.Stats, error) { + return cont.Cgroup.GetStats() } diff --git a/pkg/ebpftracer/tracer_decode_test.go b/pkg/ebpftracer/tracer_decode_test.go index cda52f91..f99ccee8 100644 --- a/pkg/ebpftracer/tracer_decode_test.go +++ b/pkg/ebpftracer/tracer_decode_test.go @@ -191,10 +191,8 @@ func newMockContainersClient() *MockContainerClient { PodName: "dummy-container-" + dummyContainerID, Cgroup: &cgroup.Cgroup{ Id: cgroupID, - Version: cgroup.V2, ContainerRuntime: cgroup.ContainerdRuntime, ContainerID: dummyContainerID, - Path: "", }, PIDs: []uint32{}, }, nil diff --git a/pkg/ebpftracer/tracer_filter_test.go b/pkg/ebpftracer/tracer_filter_test.go index 34263e32..bdd506c0 100644 --- a/pkg/ebpftracer/tracer_filter_test.go +++ b/pkg/ebpftracer/tracer_filter_test.go @@ -162,8 +162,7 @@ func buildTestTracer(options ...tracerOption) *Tracer { return &containers.Container{ CgroupID: cg, Cgroup: &cgroup.Cgroup{ - Id: cg, - Version: cgroup.V1, + Id: cg, }, }, nil }, diff --git a/pkg/ebpftracer/tracer_playground_test.go b/pkg/ebpftracer/tracer_playground_test.go index 8e11ca5c..8c6768b9 100644 --- a/pkg/ebpftracer/tracer_playground_test.go +++ b/pkg/ebpftracer/tracer_playground_test.go @@ -88,10 +88,8 @@ func TestTracer(t *testing.T) { PodName: "dummy-container-" + dummyContainerID, Cgroup: &cgroup.Cgroup{ Id: cgroupID, - Version: cgroup.V2, ContainerRuntime: cgroup.ContainerdRuntime, ContainerID: dummyContainerID, - Path: "", }, PIDs: []uint32{}, }, nil diff --git a/pkg/proc/proc.go b/pkg/proc/proc.go index 9530d1e9..bd696a00 100644 --- a/pkg/proc/proc.go +++ b/pkg/proc/proc.go @@ -1,6 +1,7 @@ package proc import ( + "bufio" "bytes" "errors" "fmt" @@ -9,8 +10,11 @@ import ( "path" "strconv" "strings" + "sync" "syscall" + castaipb "github.com/castai/kvisor/api/v1/runtime" + "github.com/castai/kvisor/pkg/cgroup" "github.com/samber/lo" ) @@ -163,7 +167,7 @@ func parsePID(pidStr string) (PID, error) { } func (p *Proc) GetNSForPID(pid PID, ns NamespaceType) (NamespaceID, error) { - info, err := p.procFS.Stat(fmt.Sprintf("%d/ns/%s", pid, ns)) + info, err := p.procFS.Stat(path.Join(strconv.Itoa(int(pid)), "ns", string(ns))) if err != nil { return 0, err } @@ -177,7 +181,7 @@ func (p *Proc) GetNSForPID(pid PID, ns NamespaceType) (NamespaceID, error) { // GetProcessStartTime parses the /proc//stat file to determine the start time of the process after system boot. func (p *Proc) GetProcessStartTime(pid PID) (uint64, error) { - data, err := p.procFS.ReadFile(fmt.Sprintf("%d/stat", pid)) + data, err := p.procFS.ReadFile(path.Join(strconv.Itoa(int(pid)), "stat")) if err != nil { return 0, err } @@ -198,3 +202,80 @@ func (p *Proc) GetProcessStartTime(pid PID) (uint64, error) { return strconv.ParseUint(string(fields[adjustedStartTimeIdx]), 10, 64) } + +var psiCheckOnce = sync.OnceValue(func() bool { + _, err := os.Stat("/proc/pressure/cpu") + return err == nil +}) + +func (p *Proc) PSIEnabled() bool { + return psiCheckOnce() +} + +func (*Proc) GetPSIStats(file string) (*castaipb.PSIStats, error) { + return cgroup.StatPSI("/proc/pressure", file) +} + +func (p *Proc) GetMeminfoStats() (*castaipb.MemoryStats, error) { + f, err := p.procFS.Open("meminfo") + if err != nil { + return nil, err + } + defer f.Close() + + // Fields we are interested in. + var ( + memTotal uint64 + memFree uint64 + swapFree uint64 + swapTotal uint64 + ) + mem := map[string]*uint64{ + "MemTotal": &memTotal, + "MemFree": &memFree, + "SwapFree": &swapFree, + "SwapTotal": &swapTotal, + } + + found := 0 + sc := bufio.NewScanner(f) + for sc.Scan() { + parts := strings.SplitN(sc.Text(), ":", 3) + if len(parts) != 2 { + // Should not happen. + continue + } + k := parts[0] + p, ok := mem[k] + if !ok { + // Unknown field -- not interested. + continue + } + vStr := strings.TrimSpace(strings.TrimSuffix(parts[1], " kB")) + *p, err = strconv.ParseUint(vStr, 10, 64) + if err != nil { + return nil, err + } + + found++ + if found == len(mem) { + // Got everything we need -- skip the rest. + break + } + } + if err := sc.Err(); err != nil { + return nil, err + } + + memUsage := memTotal - memFree + swapUsage := (swapTotal - swapFree) * 1024 + + return &castaipb.MemoryStats{ + Usage: &castaipb.MemoryData{ + Usage: memUsage, + }, + SwapOnlyUsage: &castaipb.MemoryData{ + Usage: swapUsage, + }, + }, nil +} diff --git a/pkg/stats/stats.go b/pkg/stats/stats.go deleted file mode 100644 index 6d33897f..00000000 --- a/pkg/stats/stats.go +++ /dev/null @@ -1,56 +0,0 @@ -package stats - -import ( - "strconv" - - commonpb "github.com/castai/kvisor/api/v1/runtime" -) - -const ( - SubgroupCPUUsage = 1 - SubgroupCPUThrottled = 2 - SubgroupMemoryUsage = 11 - SubgroupMemoryLimit = 12 - SubgroupNetworkTxBytes = 21 - SubgroupNetworkRxBytes = 22 - SubgroupNetworkTxDropped = 23 - SubgroupNetworkRxDropped = 24 -) - -func SubgroupString(subgroup int) string { - switch subgroup { - case SubgroupCPUUsage, SubgroupMemoryUsage: - return "usage" - case SubgroupCPUThrottled: - return "throttled" - case SubgroupMemoryLimit: - return "limit" - case SubgroupNetworkTxBytes: - return "tx_bytes" - case SubgroupNetworkRxBytes: - return "rx_bytes" - case SubgroupNetworkTxDropped: - return "tx_dropped" - case SubgroupNetworkRxDropped: - return "rx_dropped" - } - return strconv.Itoa(subgroup) -} - -func GroupString(group commonpb.StatsGroup) string { - switch group { - case commonpb.StatsGroup_STATS_GROUP_CPU: - return "cpu" - case commonpb.StatsGroup_STATS_GROUP_MEMORY: - return "memory" - case commonpb.StatsGroup_STATS_GROUP_SYSCALL: - return "syscall" - case commonpb.StatsGroup_STATS_GROUP_IO: - return "io" - case commonpb.StatsGroup_STATS_GROUP_NET: - return "net" - case commonpb.StatsGroup_STATS_GROUP_UNKNOWN: - return "" - } - return group.String() -}