From 2b75f1f952141eaf89c6a23ca046c93b8a93240b Mon Sep 17 00:00:00 2001 From: tautvydasliekis Date: Thu, 28 Aug 2025 13:11:13 +0300 Subject: [PATCH 1/6] feat: Add sustainability metrics pipeline --- api/v1/kube/kube_api.pb.go | 130 +- api/v1/kube/kube_api_grpc.pb.go | 2 +- api/v1/runtime/common.pb.go | 490 +++---- api/v1/runtime/runtime_agent_api.pb.go | 1157 ++++++++--------- api/v1/runtime/runtime_agent_api.proto | 20 + api/v1/runtime/runtime_agent_api_grpc.pb.go | 2 +- charts/kvisor/templates/agent.yaml | 124 ++ charts/kvisor/values-local.yaml | 4 + charts/kvisor/values.yaml | 4 + cmd/agent/daemon/app/app.go | 11 +- cmd/agent/daemon/clickhouse_init.go | 4 +- cmd/agent/daemon/config/config.go | 6 + cmd/agent/daemon/daemon.go | 7 + .../clickhouse/clickhouse_databatch_writer.go | 42 + cmd/agent/daemon/export/clickhouse/schemas.go | 21 + cmd/agent/daemon/metrics/agent.go | 1 + cmd/agent/daemon/pipeline/controller.go | 17 +- .../pipeline/sustainability_pipeline.go | 50 + cmd/agent/daemon/sustainability/scraper.go | 107 ++ cmd/agent/daemon/sustainability/types.go | 30 + 20 files changed, 1204 insertions(+), 1025 deletions(-) create mode 100644 cmd/agent/daemon/pipeline/sustainability_pipeline.go create mode 100644 cmd/agent/daemon/sustainability/scraper.go create mode 100644 cmd/agent/daemon/sustainability/types.go diff --git a/api/v1/kube/kube_api.pb.go b/api/v1/kube/kube_api.pb.go index 5a5a94e4..8a0c6349 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.36.4 -// protoc v5.29.3 +// protoc-gen-go v1.36.8 +// protoc v6.32.0 // source: api/v1/kube/kube_api.proto package v1 @@ -527,89 +527,49 @@ func (x *Pod) GetNodeName() string { var File_api_v1_kube_kube_api_proto protoreflect.FileDescriptor -var file_api_v1_kube_kube_api_proto_rawDesc = string([]byte{ - 0x0a, 0x1a, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x2f, 0x6b, 0x75, - 0x62, 0x65, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x6b, 0x75, - 0x62, 0x65, 0x2e, 0x76, 0x31, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x58, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x64, 0x73, - 0x5f, 0x63, 0x69, 0x64, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x64, - 0x73, 0x43, 0x69, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x63, 0x69, 0x64, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x43, 0x69, 0x64, 0x72, 0x22, 0x22, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x49, - 0x50, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x22, 0x38, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x49, 0x50, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x23, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x50, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0xf8, 0x01, 0x0a, 0x06, 0x49, 0x50, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, - 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x7a, 0x6f, 0x6e, 0x65, 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, 0x22, 0x21, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x69, 0x64, 0x22, 0x30, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x03, 0x70, 0x6f, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, - 0x64, 0x52, 0x03, 0x70, 0x6f, 0x64, 0x22, 0xba, 0x01, 0x0a, 0x03, 0x50, 0x6f, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, - 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, - 0x6b, 0x75, 0x62, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, - 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x2a, 0xed, 0x01, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x15, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x1c, 0x0a, 0x18, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, - 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x1d, 0x0a, - 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, - 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, - 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x46, 0x55, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, - 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x41, - 0x45, 0x4d, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x57, 0x4f, - 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, - 0x05, 0x12, 0x19, 0x0a, 0x15, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x4a, 0x4f, 0x42, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, - 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, - 0x44, 0x10, 0x07, 0x32, 0xdb, 0x01, 0x0a, 0x07, 0x4b, 0x75, 0x62, 0x65, 0x41, 0x50, 0x49, 0x12, - 0x51, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x1e, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x49, 0x50, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x19, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x50, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6b, 0x75, 0x62, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x50, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, - 0x12, 0x16, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x61, 0x73, 0x74, 0x61, 0x69, 0x2f, 0x6b, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, -}) +const file_api_v1_kube_kube_api_proto_rawDesc = "" + + "\n" + + "\x1aapi/v1/kube/kube_api.proto\x12\akube.v1\"\x17\n" + + "\x15GetClusterInfoRequest\"X\n" + + "\x16GetClusterInfoResponse\x12\x1b\n" + + "\tpods_cidr\x18\x01 \x03(\tR\bpodsCidr\x12!\n" + + "\fservice_cidr\x18\x02 \x03(\tR\vserviceCidr\"\"\n" + + "\x10GetIPInfoRequest\x12\x0e\n" + + "\x02ip\x18\x01 \x01(\fR\x02ip\"8\n" + + "\x11GetIPInfoResponse\x12#\n" + + "\x04info\x18\x01 \x01(\v2\x0f.kube.v1.IPInfoR\x04info\"\xf8\x01\n" + + "\x06IPInfo\x12\x17\n" + + "\apod_uid\x18\x01 \x01(\tR\x06podUid\x12\x19\n" + + "\bpod_name\x18\x03 \x01(\tR\apodName\x12\x1c\n" + + "\tnamespace\x18\x02 \x01(\tR\tnamespace\x12#\n" + + "\rworkload_name\x18\x04 \x01(\tR\fworkloadName\x12#\n" + + "\rworkload_kind\x18\x05 \x01(\tR\fworkloadKind\x12!\n" + + "\fworkload_uid\x18\x06 \x01(\tR\vworkloadUid\x12\x12\n" + + "\x04zone\x18\a \x01(\tR\x04zone\x12\x1b\n" + + "\tnode_name\x18\b \x01(\tR\bnodeName\"!\n" + + "\rGetPodRequest\x12\x10\n" + + "\x03uid\x18\x02 \x01(\tR\x03uid\"0\n" + + "\x0eGetPodResponse\x12\x1e\n" + + "\x03pod\x18\x01 \x01(\v2\f.kube.v1.PodR\x03pod\"\xba\x01\n" + + "\x03Pod\x12!\n" + + "\fworkload_uid\x18\x01 \x01(\tR\vworkloadUid\x12#\n" + + "\rworkload_name\x18\x02 \x01(\tR\fworkloadName\x12:\n" + + "\rworkload_kind\x18\x03 \x01(\x0e2\x15.kube.v1.WorkloadKindR\fworkloadKind\x12\x12\n" + + "\x04zone\x18\x04 \x01(\tR\x04zone\x12\x1b\n" + + "\tnode_name\x18\x05 \x01(\tR\bnodeName*\xed\x01\n" + + "\fWorkloadKind\x12\x19\n" + + "\x15WORKLOAD_KIND_UNKNOWN\x10\x00\x12\x1c\n" + + "\x18WORKLOAD_KIND_DEPLOYMENT\x10\x01\x12\x1d\n" + + "\x19WORKLOAD_KIND_REPLICA_SET\x10\x02\x12\x1e\n" + + "\x1aWORKLOAD_KIND_STATEFUL_SET\x10\x03\x12\x1c\n" + + "\x18WORKLOAD_KIND_DAEMON_SET\x10\x04\x12\x15\n" + + "\x11WORKLOAD_KIND_JOB\x10\x05\x12\x19\n" + + "\x15WORKLOAD_KIND_CRONJOB\x10\x06\x12\x15\n" + + "\x11WORKLOAD_KIND_POD\x10\a2\xdb\x01\n" + + "\aKubeAPI\x12Q\n" + + "\x0eGetClusterInfo\x12\x1e.kube.v1.GetClusterInfoRequest\x1a\x1f.kube.v1.GetClusterInfoResponse\x12B\n" + + "\tGetIPInfo\x12\x19.kube.v1.GetIPInfoRequest\x1a\x1a.kube.v1.GetIPInfoResponse\x129\n" + + "\x06GetPod\x12\x16.kube.v1.GetPodRequest\x1a\x17.kube.v1.GetPodResponseB&Z$github.com/castai/kvisor/api/kube/v1b\x06proto3" var ( file_api_v1_kube_kube_api_proto_rawDescOnce sync.Once diff --git a/api/v1/kube/kube_api_grpc.pb.go b/api/v1/kube/kube_api_grpc.pb.go index 3112dbe8..81f20a33 100644 --- a/api/v1/kube/kube_api_grpc.pb.go +++ b/api/v1/kube/kube_api_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.3 +// - protoc v6.32.0 // source: api/v1/kube/kube_api.proto package v1 diff --git a/api/v1/runtime/common.pb.go b/api/v1/runtime/common.pb.go index 425d7c20..593f565e 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.36.4 -// protoc v5.29.3 +// protoc-gen-go v1.36.8 +// protoc v6.32.0 // source: api/v1/runtime/common.proto package v1 @@ -2180,316 +2180,182 @@ func (x *IOStats) GetPsi() *PSIStats { var File_api_v1_runtime_common_proto protoreflect.FileDescriptor -var file_api_v1_runtime_common_proto_rawDesc = string([]byte{ - 0x0a, 0x1b, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x22, 0x4e, 0x0a, 0x03, 0x41, 0x6e, 0x79, - 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x79, 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x79, - 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x65, 0x0a, 0x04, 0x45, 0x78, 0x65, - 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x61, 0x73, - 0x68, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, - 0x68, 0x61, 0x73, 0x68, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, - 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, - 0x22, 0x0d, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x46, 0x6f, 0x72, 0x6b, 0x22, - 0x2a, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x69, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x3b, 0x0a, 0x04, 0x46, - 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x61, 0x73, 0x68, 0x5f, - 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x68, 0x61, - 0x73, 0x68, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x22, 0x8e, 0x01, 0x0a, 0x05, 0x54, 0x75, 0x70, - 0x6c, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x73, 0x72, 0x63, 0x49, 0x70, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, - 0x5f, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x64, 0x73, 0x74, 0x49, 0x70, - 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, - 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, - 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6e, 0x73, 0x5f, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6e, - 0x73, 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd0, 0x01, 0x0a, 0x03, 0x44, 0x4e, - 0x53, 0x12, 0x2c, 0x0a, 0x11, 0x44, 0x4e, 0x53, 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x44, 0x4e, - 0x53, 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, - 0x30, 0x0a, 0x07, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x4e, - 0x53, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x52, 0x07, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, - 0x73, 0x12, 0x40, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 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, 0x82, 0x01, 0x0a, - 0x0a, 0x44, 0x4e, 0x53, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 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, 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, 0xd5, 0x03, 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, 0x12, - 0x53, 0x0a, 0x12, 0x67, 0x69, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x74, 0x43, 0x6c, 0x6f, 0x6e, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x48, 0x00, 0x52, 0x10, 0x67, 0x69, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x12, 0x81, 0x01, 0x0a, 0x22, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x5f, 0x6e, 0x69, 0x67, 0x68, 0x74, 0x6d, 0x61, 0x72, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x6f, - 0x69, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x32, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4e, 0x69, 0x67, 0x68, 0x74, 0x6d, 0x61, 0x72, 0x65, 0x45, - 0x78, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x46, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x1f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x4e, 0x69, 0x67, 0x68, 0x74, 0x6d, 0x61, 0x72, 0x65, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x69, 0x74, - 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, 0x9f, 0x01, 0x0a, 0x17, 0x47, - 0x69, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x46, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x69, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x75, - 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, - 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x68, 0x22, 0x28, 0x0a, 0x26, - 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4e, 0x69, 0x67, 0x68, 0x74, 0x6d, 0x61, 0x72, 0x65, - 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x46, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x8a, 0x04, 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, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 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, 0xd8, - 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, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, - 0x52, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x4e, 0x45, 0x5f, 0x44, 0x45, 0x54, - 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x30, 0x0a, 0x2c, 0x53, 0x49, 0x47, 0x4e, 0x41, - 0x54, 0x55, 0x52, 0x45, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x4e, 0x49, 0x47, - 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x4f, 0x49, 0x54, 0x5f, 0x44, - 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x05, 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, 0xbe, 0x01, 0x0a, 0x12, 0x47, 0x69, 0x74, - 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x16, 0x0a, 0x12, 0x47, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x47, 0x49, 0x54, 0x5f, 0x52, - 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x53, 0x53, 0x48, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x47, - 0x49, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x47, 0x49, 0x54, 0x10, 0x02, 0x12, - 0x13, 0x0a, 0x0f, 0x47, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x48, 0x54, - 0x54, 0x50, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x47, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, - 0x54, 0x45, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x47, 0x49, - 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x46, 0x54, 0x50, 0x10, 0x05, 0x12, 0x13, - 0x0a, 0x0f, 0x47, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x46, 0x54, 0x50, - 0x53, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x47, 0x49, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x54, - 0x45, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x10, 0x07, 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, -}) +const file_api_v1_runtime_common_proto_rawDesc = "" + + "\n" + + "\x1bapi/v1/runtime/common.proto\x12\n" + + "runtime.v1\"N\n" + + "\x03Any\x12\x19\n" + + "\bevent_id\x18\x01 \x01(\rR\aeventId\x12\x18\n" + + "\asyscall\x18\x02 \x01(\rR\asyscall\x12\x12\n" + + "\x04data\x18\x03 \x01(\fR\x04data\"e\n" + + "\x04Exec\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\x12\x12\n" + + "\x04args\x18\x02 \x03(\tR\x04args\x12\x1f\n" + + "\vhash_sha256\x18\x03 \x01(\fR\n" + + "hashSha256\x12\x14\n" + + "\x05flags\x18\x04 \x01(\rR\x05flags\"\r\n" + + "\vProcessFork\"*\n" + + "\vProcessExit\x12\x1b\n" + + "\texit_code\x18\x01 \x01(\x03R\bexitCode\";\n" + + "\x04File\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\x12\x1f\n" + + "\vhash_sha256\x18\x02 \x01(\fR\n" + + "hashSha256\"\x8e\x01\n" + + "\x05Tuple\x12\x15\n" + + "\x06src_ip\x18\x01 \x01(\fR\x05srcIp\x12\x15\n" + + "\x06dst_ip\x18\x02 \x01(\fR\x05dstIp\x12\x19\n" + + "\bsrc_port\x18\x03 \x01(\rR\asrcPort\x12\x19\n" + + "\bdst_port\x18\x04 \x01(\rR\adstPort\x12!\n" + + "\fdns_question\x18\x05 \x01(\tR\vdnsQuestion\"\xd0\x01\n" + + "\x03DNS\x12,\n" + + "\x11DNSQuestionDomain\x18\x01 \x01(\tR\x11DNSQuestionDomain\x120\n" + + "\aanswers\x18\x02 \x03(\v2\x16.runtime.v1.DNSAnswersR\aanswers\x12@\n" + + "\x0eflow_direction\x18\x03 \x01(\x0e2\x19.runtime.v1.FlowDirectionR\rflowDirection\x12'\n" + + "\x05tuple\x18\x04 \x01(\v2\x11.runtime.v1.TupleR\x05tuple\"\x82\x01\n" + + "\n" + + "DNSAnswers\x12\x12\n" + + "\x04type\x18\x01 \x01(\rR\x04type\x12\x14\n" + + "\x05class\x18\x02 \x01(\rR\x05class\x12\x10\n" + + "\x03ttl\x18\x03 \x01(\rR\x03ttl\x12\x12\n" + + "\x04name\x18\x04 \x01(\tR\x04name\x12\x0e\n" + + "\x02ip\x18\x05 \x01(\fR\x02ip\x12\x14\n" + + "\x05cname\x18\x06 \x01(\tR\x05cname\"2\n" + + "\bLogEvent\x12\x14\n" + + "\x05level\x18\x01 \x01(\x05R\x05level\x12\x10\n" + + "\x03msg\x18\x02 \x01(\tR\x03msg\"\x83\x01\n" + + "\x0eSignatureEvent\x129\n" + + "\bmetadata\x18\x01 \x01(\v2\x1d.runtime.v1.SignatureMetadataR\bmetadata\x126\n" + + "\afinding\x18\x02 \x01(\v2\x1c.runtime.v1.SignatureFindingR\afinding\"[\n" + + "\x11SignatureMetadata\x12,\n" + + "\x02id\x18\x01 \x01(\x0e2\x1c.runtime.v1.SignatureEventIDR\x02id\x12\x18\n" + + "\aversion\x18\x02 \x01(\tR\aversion\"\xd5\x03\n" + + "\x10SignatureFinding\x12M\n" + + "\x10stdio_via_socket\x18\x01 \x01(\v2!.runtime.v1.StdioViaSocketFindingH\x00R\x0estdioViaSocket\x12C\n" + + "\ftty_detected\x18\x02 \x01(\v2\x1e.runtime.v1.TtyDetectedFindingH\x00R\vttyDetected\x12L\n" + + "\x0fsocks5_detected\x18\x03 \x01(\v2!.runtime.v1.SOCKS5DetectedFindingH\x00R\x0esocks5Detected\x12S\n" + + "\x12git_clone_detected\x18\x04 \x01(\v2#.runtime.v1.GitCloneDetectedFindingH\x00R\x10gitCloneDetected\x12\x81\x01\n" + + "\"ingress_nightmare_exploit_detected\x18\x05 \x01(\v22.runtime.v1.IngressNightmareExploitDetectedFindingH\x00R\x1fingressNightmareExploitDetectedB\x06\n" + + "\x04data\"W\n" + + "\x15StdioViaSocketFinding\x12\x0e\n" + + "\x02ip\x18\x01 \x01(\fR\x02ip\x12\x12\n" + + "\x04port\x18\x02 \x01(\rR\x04port\x12\x1a\n" + + "\bsocketfd\x18\x03 \x01(\x05R\bsocketfd\"(\n" + + "\x12TtyDetectedFinding\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\"\x97\x02\n" + + "\x15SOCKS5DetectedFinding\x12*\n" + + "\x04role\x18\x01 \x01(\x0e2\x16.runtime.v1.SOCKS5RoleR\x04role\x12@\n" + + "\x0eflow_direction\x18\x02 \x01(\x0e2\x19.runtime.v1.FlowDirectionR\rflowDirection\x12 \n" + + "\fcmd_or_reply\x18\x03 \x01(\rR\n" + + "cmdOrReply\x12@\n" + + "\faddress_type\x18\x04 \x01(\x0e2\x1d.runtime.v1.SOCKS5AddressTypeR\vaddressType\x12\x18\n" + + "\aaddress\x18\x05 \x01(\fR\aaddress\x12\x12\n" + + "\x04port\x18\x06 \x01(\rR\x04port\"\xaa\x01\n" + + "\aSSHData\x12@\n" + + "\x0eflow_direction\x18\x01 \x01(\x0e2\x19.runtime.v1.FlowDirectionR\rflowDirection\x12\x18\n" + + "\aversion\x18\x02 \x01(\tR\aversion\x12\x1a\n" + + "\bcomments\x18\x03 \x01(\tR\bcomments\x12'\n" + + "\x05tuple\x18\x04 \x01(\v2\x11.runtime.v1.TupleR\x05tuple\"\x9f\x01\n" + + "\x17GitCloneDetectedFinding\x122\n" + + "\x04type\x18\x01 \x01(\x0e2\x1e.runtime.v1.GitCloneRemoteTypeR\x04type\x12\x1b\n" + + "\tfull_repo\x18\x02 \x01(\tR\bfullRepo\x12\x16\n" + + "\x06server\x18\x03 \x01(\tR\x06server\x12\x1b\n" + + "\trepo_path\x18\x04 \x01(\tR\brepoPath\"(\n" + + "&IngressNightmareExploitDetectedFinding\"\x8a\x04\n" + + "\aNetflow\x12\x1c\n" + + "\ttimestamp\x18\x01 \x01(\x04R\ttimestamp\x12!\n" + + "\fprocess_name\x18\x02 \x01(\tR\vprocessName\x12\x1c\n" + + "\tnamespace\x18\x03 \x01(\tR\tnamespace\x12\x19\n" + + "\bpod_name\x18\x04 \x01(\tR\apodName\x12%\n" + + "\x0econtainer_name\x18\x05 \x01(\tR\rcontainerName\x12#\n" + + "\rworkload_name\x18\x06 \x01(\tR\fworkloadName\x12#\n" + + "\rworkload_kind\x18\a \x01(\tR\fworkloadKind\x12\x12\n" + + "\x04zone\x18\b \x01(\tR\x04zone\x12\x1b\n" + + "\tnode_name\x18\r \x01(\tR\bnodeName\x12\x12\n" + + "\x04addr\x18\t \x01(\fR\x04addr\x12\x12\n" + + "\x04port\x18\n" + + " \x01(\rR\x04port\x12\x10\n" + + "\x03pid\x18\x0e \x01(\rR\x03pid\x12,\n" + + "\x12process_start_time\x18\x0f \x01(\x04R\x10processStartTime\x127\n" + + "\bprotocol\x18\v \x01(\x0e2\x1b.runtime.v1.NetflowProtocolR\bprotocol\x12B\n" + + "\fdestinations\x18\f \x03(\v2\x1e.runtime.v1.NetflowDestinationR\fdestinations\"\x87\x03\n" + + "\x12NetflowDestination\x12\x1c\n" + + "\tnamespace\x18\x01 \x01(\tR\tnamespace\x12\x19\n" + + "\bpod_name\x18\x02 \x01(\tR\apodName\x12#\n" + + "\rworkload_name\x18\x03 \x01(\tR\fworkloadName\x12#\n" + + "\rworkload_kind\x18\x04 \x01(\tR\fworkloadKind\x12\x12\n" + + "\x04zone\x18\x05 \x01(\tR\x04zone\x12!\n" + + "\fdns_question\x18\x06 \x01(\tR\vdnsQuestion\x12\x1b\n" + + "\tnode_name\x18\x0e \x01(\tR\bnodeName\x12\x12\n" + + "\x04addr\x18\b \x01(\fR\x04addr\x12\x12\n" + + "\x04port\x18\t \x01(\rR\x04port\x12\x19\n" + + "\btx_bytes\x18\n" + + " \x01(\x04R\atxBytes\x12\x19\n" + + "\brx_bytes\x18\v \x01(\x04R\arxBytes\x12\x1d\n" + + "\n" + + "tx_packets\x18\f \x01(\x04R\ttxPackets\x12\x1d\n" + + "\n" + + "rx_packets\x18\r \x01(\x04R\trxPackets\"\x1f\n" + + "\aPSIData\x12\x14\n" + + "\x05total\x18\x01 \x01(\x04R\x05total\"\\\n" + + "\bPSIStats\x12'\n" + + "\x04some\x18\x01 \x01(\v2\x13.runtime.v1.PSIDataR\x04some\x12'\n" + + "\x04full\x18\x02 \x01(\v2\x13.runtime.v1.PSIDataR\x04full\"\x83\x02\n" + + "\bCpuStats\x12\x1f\n" + + "\vtotal_usage\x18\x01 \x01(\x04R\n" + + "totalUsage\x12.\n" + + "\x13usage_in_kernelmode\x18\x02 \x01(\x04R\x11usageInKernelmode\x12*\n" + + "\x11usage_in_usermode\x18\x03 \x01(\x04R\x0fusageInUsermode\x12+\n" + + "\x11throttled_periods\x18\x04 \x01(\x04R\x10throttledPeriods\x12%\n" + + "\x0ethrottled_time\x18\x05 \x01(\x04R\rthrottledTime\x12&\n" + + "\x03psi\x18\x06 \x01(\v2\x14.runtime.v1.PSIStatsR\x03psi\"8\n" + + "\n" + + "MemoryData\x12\x14\n" + + "\x05usage\x18\x01 \x01(\x04R\x05usage\x12\x14\n" + + "\x05limit\x18\x02 \x01(\x04R\x05limit\"\xb9\x01\n" + + "\vMemoryStats\x12\x14\n" + + "\x05cache\x18\x01 \x01(\x04R\x05cache\x12,\n" + + "\x05usage\x18\x02 \x01(\v2\x16.runtime.v1.MemoryDataR\x05usage\x12>\n" + + "\x0fswap_only_usage\x18\x04 \x01(\v2\x16.runtime.v1.MemoryDataR\rswapOnlyUsage\x12&\n" + + "\x03psi\x18\b \x01(\v2\x14.runtime.v1.PSIStatsR\x03psi\";\n" + + "\tPidsStats\x12\x18\n" + + "\acurrent\x18\x01 \x01(\x04R\acurrent\x12\x14\n" + + "\x05limit\x18\x02 \x01(\x04R\x05limit\"1\n" + + "\aIOStats\x12&\n" + + "\x03psi\x18\x01 \x01(\v2\x14.runtime.v1.PSIStatsR\x03psi*D\n" + + "\rFlowDirection\x12\x10\n" + + "\fFLOW_UNKNOWN\x10\x00\x12\x10\n" + + "\fFLOW_INGRESS\x10\x01\x12\x0f\n" + + "\vFLOW_EGRESS\x10\x02*\xd8\x01\n" + + "\x10SignatureEventID\x12\x15\n" + + "\x11SIGNATURE_UNKNOWN\x10\x00\x12\x1e\n" + + "\x1aSIGNATURE_STDIO_VIA_SOCKET\x10\x01\x12\x1a\n" + + "\x16SIGNATURE_TTY_DETECTED\x10\x02\x12\x1d\n" + + "\x19SIGNATURE_SOCKS5_DETECTED\x10\x03\x12 \n" + + "\x1cSIGNATURE_GIT_CLONE_DETECTED\x10\x04\x120\n" + + ",SIGNATURE_INGRESS_NIGHTMARE_EXPLOIT_DETECTED\x10\x05*U\n" + + "\n" + + "SOCKS5Role\x12\x17\n" + + "\x13SOCKS5_ROLE_UNKNOWN\x10\x00\x12\x16\n" + + "\x12SOCKS5_ROLE_CLIENT\x10\x01\x12\x16\n" + + "\x12SOCKS5_ROLE_SERVER\x10\x02*\x95\x01\n" + + "\x11SOCKS5AddressType\x12\x1f\n" + + "\x1bSOCKS5_ADDRESS_TYPE_UNKNOWN\x10\x00\x12\x1c\n" + + "\x18SOCKS5_ADDRESS_TYPE_IPv4\x10\x01\x12#\n" + + "\x1fSOCKS5_ADDRESS_TYPE_DOMAIN_NAME\x10\x03\x12\x1c\n" + + "\x18SOCKS5_ADDRESS_TYPE_IPv6\x10\x04*\xbe\x01\n" + + "\x12GitCloneRemoteType\x12\x16\n" + + "\x12GIT_REMOTE_UNKNOWN\x10\x00\x12\x12\n" + + "\x0eGIT_REMOTE_SSH\x10\x01\x12\x12\n" + + "\x0eGIT_REMOTE_GIT\x10\x02\x12\x13\n" + + "\x0fGIT_REMOTE_HTTP\x10\x03\x12\x14\n" + + "\x10GIT_REMOTE_HTTPS\x10\x04\x12\x12\n" + + "\x0eGIT_REMOTE_FTP\x10\x05\x12\x13\n" + + "\x0fGIT_REMOTE_FTPS\x10\x06\x12\x14\n" + + "\x10GIT_REMOTE_LOCAL\x10\a*c\n" + + "\x0fNetflowProtocol\x12\x1c\n" + + "\x18NETFLOW_PROTOCOL_UNKNOWN\x10\x00\x12\x18\n" + + "\x14NETFLOW_PROTOCOL_TCP\x10\x01\x12\x18\n" + + "\x14NETFLOW_PROTOCOL_UDP\x10\x02B*Z(github.com/castai/kvisord/api/runtime/v1b\x06proto3" var ( file_api_v1_runtime_common_proto_rawDescOnce sync.Once diff --git a/api/v1/runtime/runtime_agent_api.pb.go b/api/v1/runtime/runtime_agent_api.pb.go index 9316bbed..d5f0d5cb 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.36.4 -// protoc v5.29.3 +// protoc-gen-go v1.36.8 +// protoc v6.32.0 // source: api/v1/runtime/runtime_agent_api.proto package v1 @@ -367,6 +367,7 @@ type DataBatchItem struct { // *DataBatchItem_ContainerEvents // *DataBatchItem_Netflow // *DataBatchItem_ProcessTree + // *DataBatchItem_SustainabilityStats Data isDataBatchItem_Data `protobuf_oneof:"data"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -454,6 +455,15 @@ func (x *DataBatchItem) GetProcessTree() *ProcessTreeEvent { return nil } +func (x *DataBatchItem) GetSustainabilityStats() *SustainabilityStats { + if x != nil { + if x, ok := x.Data.(*DataBatchItem_SustainabilityStats); ok { + return x.SustainabilityStats + } + } + return nil +} + type isDataBatchItem_Data interface { isDataBatchItem_Data() } @@ -478,6 +488,10 @@ type DataBatchItem_ProcessTree struct { ProcessTree *ProcessTreeEvent `protobuf:"bytes,14,opt,name=process_tree,json=processTree,proto3,oneof"` } +type DataBatchItem_SustainabilityStats struct { + SustainabilityStats *SustainabilityStats `protobuf:"bytes,15,opt,name=sustainability_stats,json=sustainabilityStats,proto3,oneof"` +} + func (*DataBatchItem_ContainerStats) isDataBatchItem_Data() {} func (*DataBatchItem_NodeStats) isDataBatchItem_Data() {} @@ -488,6 +502,8 @@ func (*DataBatchItem_Netflow) isDataBatchItem_Data() {} func (*DataBatchItem_ProcessTree) isDataBatchItem_Data() {} +func (*DataBatchItem_SustainabilityStats) isDataBatchItem_Data() {} + type GetConfigurationRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to CurrentConfig: @@ -1464,6 +1480,128 @@ func (x *NodeStats) GetIoStats() *IOStats { return nil } +type SustainabilityStats struct { + state protoimpl.MessageState `protogen:"open.v1"` + 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"` + NodeName string `protobuf:"bytes,4,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + // Energy consumption in Joules + EnergyJoules float64 `protobuf:"fixed64,5,opt,name=energy_joules,json=energyJoules,proto3" json:"energy_joules,omitempty"` + // Carbon emissions in grams of CO2 equivalent + CarbonGramsCo2E float64 `protobuf:"fixed64,6,opt,name=carbon_grams_co2e,json=carbonGramsCo2e,proto3" json:"carbon_grams_co2e,omitempty"` + // Energy cost in USD + CostUsd float64 `protobuf:"fixed64,7,opt,name=cost_usd,json=costUsd,proto3" json:"cost_usd,omitempty"` + // Carbon intensity factor used (gCO2e/kWh) + CarbonIntensityGco2PerKwh float64 `protobuf:"fixed64,8,opt,name=carbon_intensity_gco2_per_kwh,json=carbonIntensityGco2PerKwh,proto3" json:"carbon_intensity_gco2_per_kwh,omitempty"` + // Energy price factor used (USD/kWh) + EnergyPriceUsdPerKwh float64 `protobuf:"fixed64,9,opt,name=energy_price_usd_per_kwh,json=energyPriceUsdPerKwh,proto3" json:"energy_price_usd_per_kwh,omitempty"` + // Timestamp when the energy was measured + Timestamp int64 `protobuf:"varint,10,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SustainabilityStats) Reset() { + *x = SustainabilityStats{} + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SustainabilityStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SustainabilityStats) ProtoMessage() {} + +func (x *SustainabilityStats) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SustainabilityStats.ProtoReflect.Descriptor instead. +func (*SustainabilityStats) Descriptor() ([]byte, []int) { + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{14} +} + +func (x *SustainabilityStats) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SustainabilityStats) GetPodName() string { + if x != nil { + return x.PodName + } + return "" +} + +func (x *SustainabilityStats) GetContainerName() string { + if x != nil { + return x.ContainerName + } + return "" +} + +func (x *SustainabilityStats) GetNodeName() string { + if x != nil { + return x.NodeName + } + return "" +} + +func (x *SustainabilityStats) GetEnergyJoules() float64 { + if x != nil { + return x.EnergyJoules + } + return 0 +} + +func (x *SustainabilityStats) GetCarbonGramsCo2E() float64 { + if x != nil { + return x.CarbonGramsCo2E + } + return 0 +} + +func (x *SustainabilityStats) GetCostUsd() float64 { + if x != nil { + return x.CostUsd + } + return 0 +} + +func (x *SustainabilityStats) GetCarbonIntensityGco2PerKwh() float64 { + if x != nil { + return x.CarbonIntensityGco2PerKwh + } + return 0 +} + +func (x *SustainabilityStats) GetEnergyPriceUsdPerKwh() float64 { + if x != nil { + return x.EnergyPriceUsdPerKwh + } + return 0 +} + +func (x *SustainabilityStats) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type ImageMetadata struct { state protoimpl.MessageState `protogen:"open.v1"` ImageName string `protobuf:"bytes,1,opt,name=image_name,json=imageName,proto3" json:"image_name,omitempty"` @@ -1483,7 +1621,7 @@ type ImageMetadata struct { func (x *ImageMetadata) Reset() { *x = ImageMetadata{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[14] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1495,7 +1633,7 @@ func (x *ImageMetadata) String() string { func (*ImageMetadata) ProtoMessage() {} func (x *ImageMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[14] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1508,7 +1646,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{14} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{15} } func (x *ImageMetadata) GetImageName() string { @@ -1596,7 +1734,7 @@ type ImageMetadataIngestResponse struct { func (x *ImageMetadataIngestResponse) Reset() { *x = ImageMetadataIngestResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[15] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1608,7 +1746,7 @@ func (x *ImageMetadataIngestResponse) String() string { func (*ImageMetadataIngestResponse) ProtoMessage() {} func (x *ImageMetadataIngestResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[15] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1621,7 +1759,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{15} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{16} } type GetSyncStateRequest struct { @@ -1633,7 +1771,7 @@ type GetSyncStateRequest struct { func (x *GetSyncStateRequest) Reset() { *x = GetSyncStateRequest{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[16] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1645,7 +1783,7 @@ func (x *GetSyncStateRequest) String() string { func (*GetSyncStateRequest) ProtoMessage() {} func (x *GetSyncStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[16] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1658,7 +1796,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{16} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{17} } func (x *GetSyncStateRequest) GetImageIds() []string { @@ -1677,7 +1815,7 @@ type GetSyncStateResponse struct { func (x *GetSyncStateResponse) Reset() { *x = GetSyncStateResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[17] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1689,7 +1827,7 @@ func (x *GetSyncStateResponse) String() string { func (*GetSyncStateResponse) ProtoMessage() {} func (x *GetSyncStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[17] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1702,7 +1840,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{17} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{18} } func (x *GetSyncStateResponse) GetImages() *ImagesSyncState { @@ -1722,7 +1860,7 @@ type ImagesSyncState struct { func (x *ImagesSyncState) Reset() { *x = ImagesSyncState{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[18] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1734,7 +1872,7 @@ func (x *ImagesSyncState) String() string { func (*ImagesSyncState) ProtoMessage() {} func (x *ImagesSyncState) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[18] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1747,7 +1885,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{18} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{19} } func (x *ImagesSyncState) GetFullResyncRequired() bool { @@ -1778,7 +1916,7 @@ type Image struct { func (x *Image) Reset() { *x = Image{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[19] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1790,7 +1928,7 @@ func (x *Image) String() string { func (*Image) ProtoMessage() {} func (x *Image) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[19] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1803,7 +1941,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{19} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{20} } func (x *Image) GetId() string { @@ -1858,7 +1996,7 @@ type UpdateSyncStateRequest struct { func (x *UpdateSyncStateRequest) Reset() { *x = UpdateSyncStateRequest{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[20] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1870,7 +2008,7 @@ func (x *UpdateSyncStateRequest) String() string { func (*UpdateSyncStateRequest) ProtoMessage() {} func (x *UpdateSyncStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[20] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1883,7 +2021,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{20} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{21} } func (x *UpdateSyncStateRequest) GetFullSnapshot() bool { @@ -1908,7 +2046,7 @@ type UpdateSyncStateResponse struct { func (x *UpdateSyncStateResponse) Reset() { *x = UpdateSyncStateResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[21] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1920,7 +2058,7 @@ func (x *UpdateSyncStateResponse) String() string { func (*UpdateSyncStateResponse) ProtoMessage() {} func (x *UpdateSyncStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[21] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1933,7 +2071,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{21} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{22} } type KubeBenchReport struct { @@ -1946,7 +2084,7 @@ type KubeBenchReport struct { func (x *KubeBenchReport) Reset() { *x = KubeBenchReport{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[22] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1958,7 +2096,7 @@ func (x *KubeBenchReport) String() string { func (*KubeBenchReport) ProtoMessage() {} func (x *KubeBenchReport) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[22] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1971,7 +2109,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{22} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{23} } func (x *KubeBenchReport) GetControls() []*KubeBenchControls { @@ -1996,7 +2134,7 @@ type KubeBenchReportIngestResponse struct { func (x *KubeBenchReportIngestResponse) Reset() { *x = KubeBenchReportIngestResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[23] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2008,7 +2146,7 @@ func (x *KubeBenchReportIngestResponse) String() string { func (*KubeBenchReportIngestResponse) ProtoMessage() {} func (x *KubeBenchReportIngestResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[23] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2021,7 +2159,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{23} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{24} } type KubeBenchNode struct { @@ -2034,7 +2172,7 @@ type KubeBenchNode struct { func (x *KubeBenchNode) Reset() { *x = KubeBenchNode{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[24] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2046,7 +2184,7 @@ func (x *KubeBenchNode) String() string { func (*KubeBenchNode) ProtoMessage() {} func (x *KubeBenchNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[24] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2059,7 +2197,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{24} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{25} } func (x *KubeBenchNode) GetNodeName() string { @@ -2086,7 +2224,7 @@ type KubeBenchControls struct { func (x *KubeBenchControls) Reset() { *x = KubeBenchControls{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[25] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2098,7 +2236,7 @@ func (x *KubeBenchControls) String() string { func (*KubeBenchControls) ProtoMessage() {} func (x *KubeBenchControls) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[25] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2111,7 +2249,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{25} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{26} } func (x *KubeBenchControls) GetVersion() string { @@ -2137,7 +2275,7 @@ type KubeBenchGroup struct { func (x *KubeBenchGroup) Reset() { *x = KubeBenchGroup{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[26] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2149,7 +2287,7 @@ func (x *KubeBenchGroup) String() string { func (*KubeBenchGroup) ProtoMessage() {} func (x *KubeBenchGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[26] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2162,7 +2300,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{26} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{27} } func (x *KubeBenchGroup) GetChecks() []*KubeBenchCheck { @@ -2184,7 +2322,7 @@ type KubeBenchCheck struct { func (x *KubeBenchCheck) Reset() { *x = KubeBenchCheck{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[27] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2196,7 +2334,7 @@ func (x *KubeBenchCheck) String() string { func (*KubeBenchCheck) ProtoMessage() {} func (x *KubeBenchCheck) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[27] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2209,7 +2347,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{27} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{28} } func (x *KubeBenchCheck) GetId() string { @@ -2249,7 +2387,7 @@ type KubeLinterReport struct { func (x *KubeLinterReport) Reset() { *x = KubeLinterReport{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[28] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2261,7 +2399,7 @@ func (x *KubeLinterReport) String() string { func (*KubeLinterReport) ProtoMessage() {} func (x *KubeLinterReport) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[28] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2274,7 +2412,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{28} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{29} } func (x *KubeLinterReport) GetChecks() []*KubeLinterCheck { @@ -2292,7 +2430,7 @@ type KubeLinterReportIngestResponse struct { func (x *KubeLinterReportIngestResponse) Reset() { *x = KubeLinterReportIngestResponse{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[29] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2304,7 +2442,7 @@ func (x *KubeLinterReportIngestResponse) String() string { func (*KubeLinterReportIngestResponse) ProtoMessage() {} func (x *KubeLinterReportIngestResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[29] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2317,7 +2455,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{29} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{30} } type KubeLinterCheck struct { @@ -2331,7 +2469,7 @@ type KubeLinterCheck struct { func (x *KubeLinterCheck) Reset() { *x = KubeLinterCheck{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[30] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2343,7 +2481,7 @@ func (x *KubeLinterCheck) String() string { func (*KubeLinterCheck) ProtoMessage() {} func (x *KubeLinterCheck) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[30] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2356,7 +2494,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{30} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{31} } func (x *KubeLinterCheck) GetResourceUid() string { @@ -2395,7 +2533,7 @@ type Process struct { func (x *Process) Reset() { *x = Process{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[31] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2407,7 +2545,7 @@ func (x *Process) String() string { func (*Process) ProtoMessage() {} func (x *Process) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[31] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2420,7 +2558,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{31} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{32} } func (x *Process) GetPid() uint32 { @@ -2484,7 +2622,7 @@ type ProcessEvent struct { func (x *ProcessEvent) Reset() { *x = ProcessEvent{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[32] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2496,7 +2634,7 @@ func (x *ProcessEvent) String() string { func (*ProcessEvent) ProtoMessage() {} func (x *ProcessEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[32] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2509,7 +2647,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{32} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{33} } func (x *ProcessEvent) GetTimestamp() uint64 { @@ -2550,7 +2688,7 @@ type ProcessTreeEvent struct { func (x *ProcessTreeEvent) Reset() { *x = ProcessTreeEvent{} - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[33] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2562,7 +2700,7 @@ func (x *ProcessTreeEvent) String() string { func (*ProcessTreeEvent) ProtoMessage() {} func (x *ProcessTreeEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[33] + mi := &file_api_v1_runtime_runtime_agent_api_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2575,7 +2713,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{33} + return file_api_v1_runtime_runtime_agent_api_proto_rawDescGZIP(), []int{34} } func (x *ProcessTreeEvent) GetInitial() bool { @@ -2594,458 +2732,244 @@ func (x *ProcessTreeEvent) GetEvents() []*ProcessEvent { var File_api_v1_runtime_runtime_agent_api_proto protoreflect.FileDescriptor -var file_api_v1_runtime_runtime_agent_api_proto_rawDesc = string([]byte{ - 0x0a, 0x26, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x23, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x48, 0x0a, 0x15, 0x57, 0x72, 0x69, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2f, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, - 0x22, 0x18, 0x0a, 0x16, 0x57, 0x72, 0x69, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd4, 0x02, 0x0a, 0x0d, 0x44, - 0x61, 0x74, 0x61, 0x42, 0x61, 0x74, 0x63, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x45, 0x0a, 0x0f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, - 0x0a, 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, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x18, 0x0b, 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, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x10, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x77, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x77, 0x48, 0x00, 0x52, 0x07, 0x6e, - 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 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, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x72, 0x65, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x22, 0x71, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0a, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x16, - 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, - 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, - 0x08, 0x02, 0x10, 0x03, 0x22, 0x4d, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x31, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x22, 0x0f, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xde, 0x05, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 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, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 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, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, - 0x3d, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, - 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x19, - 0x0a, 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 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, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x12, 0x52, 0x0a, 0x0d, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 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, 0x61, 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, 0x32, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 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, 0x1b, 0x0a, 0x09, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, - 0x12, 0x30, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0d, 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, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, - 0x6d, 0x73, 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, 0xae, 0x06, 0x0a, 0x0e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x0a, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, - 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x68, 0x6f, 0x73, 0x74, 0x50, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x70, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x70, 0x69, 0x64, 0x12, - 0x39, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x16, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, - 0x04, 0x65, 0x78, 0x65, 0x63, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x48, 0x00, 0x52, - 0x04, 0x65, 0x78, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x03, 0x64, 0x6e, 0x73, 0x18, 0x16, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x4e, 0x53, 0x48, 0x00, 0x52, 0x03, 0x64, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x66, 0x69, - 0x6c, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x04, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x75, 0x70, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x05, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x12, 0x3a, 0x0a, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 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, 0x48, 0x00, 0x52, 0x09, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x23, 0x0a, 0x03, 0x61, 0x6e, 0x79, - 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x12, 0x4d, - 0x0a, 0x10, 0x73, 0x74, 0x64, 0x69, 0x6f, 0x5f, 0x76, 0x69, 0x61, 0x5f, 0x73, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x18, 0x1b, 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, 0x27, 0x0a, - 0x03, 0x73, 0x73, 0x68, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x53, 0x48, 0x44, 0x61, 0x74, 0x61, 0x48, - 0x00, 0x52, 0x03, 0x73, 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x46, 0x6f, 0x72, 0x6b, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x46, 0x6f, 0x72, 0x6b, 0x12, 0x3c, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x65, 0x78, 0x69, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, - 0x78, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, - 0x69, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 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, 0xf4, 0x04, 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, 0x18, 0x02, 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, 0x03, 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, 0x04, 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, 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, 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, 0x21, 0x0a, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1b, - 0x0a, 0x09, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x08, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 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, - 0x12, 0x4a, 0x0a, 0x12, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x3e, 0x0a, 0x10, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 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, 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, 0xf0, 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, 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, - 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x10, 0x0d, 0x12, 0x16, 0x0a, 0x12, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x45, 0x58, - 0x49, 0x54, 0x10, 0x0e, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x49, - 0x4c, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x0f, 0x12, 0x0e, 0x0a, 0x09, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x41, 0x4e, 0x59, 0x10, 0xe7, 0x07, 0x2a, 0xcf, 0x01, 0x0a, 0x0c, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x15, 0x57, 0x4f, - 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, - 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, - 0x54, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x5f, 0x53, 0x45, 0x54, - 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x46, 0x55, 0x4c, 0x5f, 0x53, 0x45, 0x54, - 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x57, 0x4f, 0x52, - 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x4a, - 0x4f, 0x42, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x44, 0x10, 0x06, 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, 0xfc, 0x05, 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, 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, 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, 0x59, 0x0a, 0x0e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x12, 0x21, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 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, 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, - 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, -}) +const file_api_v1_runtime_runtime_agent_api_proto_rawDesc = "" + + "\n" + + "&api/v1/runtime/runtime_agent_api.proto\x12\n" + + "runtime.v1\x1a#api/google/protobuf/timestamp.proto\x1a\x1bapi/v1/runtime/common.proto\"H\n" + + "\x15WriteDataBatchRequest\x12/\n" + + "\x05items\x18\n" + + " \x03(\v2\x19.runtime.v1.DataBatchItemR\x05items\"\x18\n" + + "\x16WriteDataBatchResponse\"\xaa\x03\n" + + "\rDataBatchItem\x12E\n" + + "\x0fcontainer_stats\x18\n" + + " \x01(\v2\x1a.runtime.v1.ContainerStatsH\x00R\x0econtainerStats\x126\n" + + "\n" + + "node_stats\x18\v \x01(\v2\x15.runtime.v1.NodeStatsH\x00R\tnodeStats\x12H\n" + + "\x10container_events\x18\f \x01(\v2\x1b.runtime.v1.ContainerEventsH\x00R\x0fcontainerEvents\x12/\n" + + "\anetflow\x18\r \x01(\v2\x13.runtime.v1.NetflowH\x00R\anetflow\x12A\n" + + "\fprocess_tree\x18\x0e \x01(\v2\x1c.runtime.v1.ProcessTreeEventH\x00R\vprocessTree\x12T\n" + + "\x14sustainability_stats\x18\x0f \x01(\v2\x1f.runtime.v1.SustainabilityStatsH\x00R\x13sustainabilityStatsB\x06\n" + + "\x04data\"q\n" + + "\x17GetConfigurationRequest\x12 \n" + + "\n" + + "controller\x18\x03 \x01(\fH\x00R\n" + + "controller\x12\x16\n" + + "\x05agent\x18\x04 \x01(\fH\x00R\x05agentB\x10\n" + + "\x0ecurrent_configJ\x04\b\x01\x10\x02J\x04\b\x02\x10\x03\"M\n" + + "\x18GetConfigurationResponse\x121\n" + + "\x06config\x18\x01 \x01(\v2\x19.runtime.v1.ConfigurationR\x06config\"\x0f\n" + + "\rConfiguration\"B\n" + + "\x0fProcessIdentity\x12\x10\n" + + "\x03pid\x18\x01 \x01(\rR\x03pid\x12\x1d\n" + + "\n" + + "start_time\x18\x02 \x01(\x04R\tstartTime\"\xde\x05\n" + + "\x0fContainerEvents\x12\x1b\n" + + "\tnode_name\x18\x01 \x01(\tR\bnodeName\x12\x1c\n" + + "\tnamespace\x18\x02 \x01(\tR\tnamespace\x12#\n" + + "\rworkload_name\x18\x03 \x01(\tR\fworkloadName\x12!\n" + + "\fworkload_uid\x18\x04 \x01(\tR\vworkloadUid\x12=\n" + + "\rworkload_kind\x18\x05 \x01(\x0e2\x18.runtime.v1.WorkloadKindR\fworkloadKind\x12\x19\n" + + "\bpod_name\x18\x06 \x01(\tR\apodName\x12%\n" + + "\x0econtainer_name\x18\a \x01(\tR\rcontainerName\x12!\n" + + "\fcontainer_id\x18\b \x01(\tR\vcontainerId\x12\x17\n" + + "\apod_uid\x18\t \x01(\tR\x06podUid\x12R\n" + + "\robject_labels\x18\n" + + " \x03(\v2-.runtime.v1.ContainerEvents.ObjectLabelsEntryR\fobjectLabels\x12a\n" + + "\x12object_annotations\x18\v \x03(\v22.runtime.v1.ContainerEvents.ObjectAnnotationsEntryR\x11objectAnnotations\x12\x1b\n" + + "\tcgroup_id\x18\f \x01(\x04R\bcgroupId\x120\n" + + "\x05items\x18\r \x03(\v2\x1a.runtime.v1.ContainerEventR\x05items\x1a?\n" + + "\x11ObjectLabelsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aD\n" + + "\x16ObjectAnnotationsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xae\x06\n" + + "\x0eContainerEvent\x124\n" + + "\n" + + "event_type\x18\x01 \x01(\x0e2\x15.runtime.v1.EventTypeR\teventType\x12\x1c\n" + + "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\x12,\n" + + "\x12process_start_time\x18\x04 \x01(\x04R\x10processStartTime\x12\x19\n" + + "\bhost_pid\x18\x05 \x01(\rR\ahostPid\x12\x10\n" + + "\x03pid\x18\x06 \x01(\rR\x03pid\x12\x12\n" + + "\x04ppid\x18\a \x01(\rR\x04ppid\x129\n" + + "\x19process_parent_start_time\x18\b \x01(\x04R\x16processParentStartTime\x12!\n" + + "\fprocess_name\x18\t \x01(\tR\vprocessName\x12&\n" + + "\x04exec\x18\x15 \x01(\v2\x10.runtime.v1.ExecH\x00R\x04exec\x12#\n" + + "\x03dns\x18\x16 \x01(\v2\x0f.runtime.v1.DNSH\x00R\x03dns\x12&\n" + + "\x04file\x18\x17 \x01(\v2\x10.runtime.v1.FileH\x00R\x04file\x12)\n" + + "\x05tuple\x18\x18 \x01(\v2\x11.runtime.v1.TupleH\x00R\x05tuple\x12:\n" + + "\tsignature\x18\x19 \x01(\v2\x1a.runtime.v1.SignatureEventH\x00R\tsignature\x12#\n" + + "\x03any\x18\x1a \x01(\v2\x0f.runtime.v1.AnyH\x00R\x03any\x12M\n" + + "\x10stdio_via_socket\x18\x1b \x01(\v2!.runtime.v1.StdioViaSocketFindingH\x00R\x0estdioViaSocket\x12'\n" + + "\x03ssh\x18\x1c \x01(\v2\x13.runtime.v1.SSHDataH\x00R\x03ssh\x12<\n" + + "\fprocess_fork\x18\x1d \x01(\v2\x17.runtime.v1.ProcessForkH\x00R\vprocessFork\x12<\n" + + "\fprocess_exit\x18\x1e \x01(\v2\x17.runtime.v1.ProcessExitH\x00R\vprocessExitB\x06\n" + + "\x04data\"\x15\n" + + "\x13WriteStreamResponse\"\x12\n" + + "\x10SendLogsResponse\"\xf4\x04\n" + + "\x0eContainerStats\x12\x1c\n" + + "\tnamespace\x18\x01 \x01(\tR\tnamespace\x12\x19\n" + + "\bpod_name\x18\x02 \x01(\tR\apodName\x12%\n" + + "\x0econtainer_name\x18\x03 \x01(\tR\rcontainerName\x12#\n" + + "\rworkload_name\x18\x04 \x01(\tR\fworkloadName\x12#\n" + + "\rworkload_kind\x18\a \x01(\tR\fworkloadKind\x12\x17\n" + + "\apod_uid\x18\x05 \x01(\tR\x06podUid\x12!\n" + + "\fcontainer_id\x18\x06 \x01(\tR\vcontainerId\x12\x1b\n" + + "\tnode_name\x18\b \x01(\tR\bnodeName\x12!\n" + + "\fworkload_uid\x18\t \x01(\tR\vworkloadUid\x12\x1b\n" + + "\tcgroup_id\x18\n" + + " \x01(\x04R\bcgroupId\x121\n" + + "\tcpu_stats\x18\x15 \x01(\v2\x14.runtime.v1.CpuStatsR\bcpuStats\x12:\n" + + "\fmemory_stats\x18\x16 \x01(\v2\x17.runtime.v1.MemoryStatsR\vmemoryStats\x124\n" + + "\n" + + "pids_stats\x18\x17 \x01(\v2\x15.runtime.v1.PidsStatsR\tpidsStats\x12.\n" + + "\bio_stats\x18\x18 \x01(\v2\x13.runtime.v1.IOStatsR\aioStats\x12J\n" + + "\x12files_access_stats\x18\x19 \x01(\v2\x1c.runtime.v1.FilesAccessStatsR\x10filesAccessStats\">\n" + + "\x10FilesAccessStats\x12\x14\n" + + "\x05paths\x18\x01 \x03(\tR\x05paths\x12\x14\n" + + "\x05reads\x18\x02 \x03(\rR\x05reads\"\xc7\x01\n" + + "\tNodeStats\x12\x1b\n" + + "\tnode_name\x18\x01 \x01(\tR\bnodeName\x121\n" + + "\tcpu_stats\x18\x15 \x01(\v2\x14.runtime.v1.CpuStatsR\bcpuStats\x12:\n" + + "\fmemory_stats\x18\x16 \x01(\v2\x17.runtime.v1.MemoryStatsR\vmemoryStats\x12.\n" + + "\bio_stats\x18\x17 \x01(\v2\x13.runtime.v1.IOStatsR\aioStats\"\x96\x03\n" + + "\x13SustainabilityStats\x12\x1c\n" + + "\tnamespace\x18\x01 \x01(\tR\tnamespace\x12\x19\n" + + "\bpod_name\x18\x02 \x01(\tR\apodName\x12%\n" + + "\x0econtainer_name\x18\x03 \x01(\tR\rcontainerName\x12\x1b\n" + + "\tnode_name\x18\x04 \x01(\tR\bnodeName\x12#\n" + + "\renergy_joules\x18\x05 \x01(\x01R\fenergyJoules\x12*\n" + + "\x11carbon_grams_co2e\x18\x06 \x01(\x01R\x0fcarbonGramsCo2e\x12\x19\n" + + "\bcost_usd\x18\a \x01(\x01R\acostUsd\x12@\n" + + "\x1dcarbon_intensity_gco2_per_kwh\x18\b \x01(\x01R\x19carbonIntensityGco2PerKwh\x126\n" + + "\x18energy_price_usd_per_kwh\x18\t \x01(\x01R\x14energyPriceUsdPerKwh\x12\x1c\n" + + "\ttimestamp\x18\n" + + " \x01(\x03R\ttimestamp\"\xf6\x02\n" + + "\rImageMetadata\x12\x1d\n" + + "\n" + + "image_name\x18\x01 \x01(\tR\timageName\x12\x19\n" + + "\bimage_id\x18\x02 \x01(\tR\aimageId\x12!\n" + + "\fimage_digest\x18\x03 \x01(\tR\vimageDigest\x12\"\n" + + "\farchitecture\x18\x05 \x01(\tR\farchitecture\x12\x17\n" + + "\aos_name\x18\x06 \x01(\tR\x06osName\x129\n" + + "\n" + + "created_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12!\n" + + "\fresource_ids\x18\b \x03(\tR\vresourceIds\x12\x1a\n" + + "\bpackages\x18\t \x01(\fR\bpackages\x12\x1a\n" + + "\bmanifest\x18\n" + + " \x01(\fR\bmanifest\x12\x14\n" + + "\x05index\x18\v \x01(\fR\x05index\x12\x1f\n" + + "\vconfig_file\x18\f \x01(\fR\n" + + "configFile\"\x1d\n" + + "\x1bImageMetadataIngestResponse\"2\n" + + "\x13GetSyncStateRequest\x12\x1b\n" + + "\timage_ids\x18\x01 \x03(\tR\bimageIds\"K\n" + + "\x14GetSyncStateResponse\x123\n" + + "\x06images\x18\x01 \x01(\v2\x1b.runtime.v1.ImagesSyncStateR\x06images\"n\n" + + "\x0fImagesSyncState\x120\n" + + "\x14full_resync_required\x18\x01 \x01(\bR\x12fullResyncRequired\x12)\n" + + "\x06images\x18\x02 \x03(\v2\x11.runtime.v1.ImageR\x06images\"\xcf\x01\n" + + "\x05Image\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\"\n" + + "\farchitecture\x18\x03 \x01(\tR\farchitecture\x12!\n" + + "\fresource_ids\x18\x04 \x03(\tR\vresourceIds\x12<\n" + + "\vscan_status\x18\x05 \x01(\x0e2\x1b.runtime.v1.ImageScanStatusR\n" + + "scanStatus\x12\x1d\n" + + "\n" + + "scan_error\x18\x06 \x01(\tR\tscanError\"h\n" + + "\x16UpdateSyncStateRequest\x12#\n" + + "\rfull_snapshot\x18\x01 \x01(\bR\ffullSnapshot\x12)\n" + + "\x06images\x18\x02 \x03(\v2\x11.runtime.v1.ImageR\x06images\"\x19\n" + + "\x17UpdateSyncStateResponse\"{\n" + + "\x0fKubeBenchReport\x129\n" + + "\bcontrols\x18\x01 \x03(\v2\x1d.runtime.v1.KubeBenchControlsR\bcontrols\x12-\n" + + "\x04node\x18\x02 \x01(\v2\x19.runtime.v1.KubeBenchNodeR\x04node\"\x1f\n" + + "\x1dKubeBenchReportIngestResponse\"O\n" + + "\rKubeBenchNode\x12\x1b\n" + + "\tnode_name\x18\x01 \x01(\tR\bnodeName\x12!\n" + + "\fresource_uid\x18\x02 \x01(\tR\vresourceUid\"a\n" + + "\x11KubeBenchControls\x12\x18\n" + + "\aversion\x18\x01 \x01(\tR\aversion\x122\n" + + "\x06groups\x18\x02 \x03(\v2\x1a.runtime.v1.KubeBenchGroupR\x06groups\"D\n" + + "\x0eKubeBenchGroup\x122\n" + + "\x06checks\x18\x01 \x03(\v2\x1a.runtime.v1.KubeBenchCheckR\x06checks\"g\n" + + "\x0eKubeBenchCheck\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04text\x18\x02 \x01(\tR\x04text\x12\x1b\n" + + "\ttest_info\x18\x03 \x03(\tR\btestInfo\x12\x14\n" + + "\x05state\x18\x04 \x01(\tR\x05state\"G\n" + + "\x10KubeLinterReport\x123\n" + + "\x06checks\x18\x01 \x03(\v2\x1b.runtime.v1.KubeLinterCheckR\x06checks\" \n" + + "\x1eKubeLinterReportIngestResponse\"d\n" + + "\x0fKubeLinterCheck\x12!\n" + + "\fresource_uid\x18\x01 \x01(\tR\vresourceUid\x12\x16\n" + + "\x06passed\x18\x02 \x01(\x04R\x06passed\x12\x16\n" + + "\x06failed\x18\x03 \x01(\x04R\x06failed\"\xc7\x01\n" + + "\aProcess\x12\x10\n" + + "\x03pid\x18\x01 \x01(\rR\x03pid\x12\x12\n" + + "\x04ppid\x18\x02 \x01(\rR\x04ppid\x12\x1d\n" + + "\n" + + "start_time\x18\x03 \x01(\x04R\tstartTime\x12*\n" + + "\x11parent_start_time\x18\x04 \x01(\x04R\x0fparentStartTime\x12\x12\n" + + "\x04args\x18\x05 \x03(\tR\x04args\x12\x1a\n" + + "\bfilepath\x18\x06 \x01(\tR\bfilepath\x12\x1b\n" + + "\texit_time\x18\a \x01(\x04R\bexitTime\"\xb1\x01\n" + + "\fProcessEvent\x12\x1c\n" + + "\ttimestamp\x18\x01 \x01(\x04R\ttimestamp\x12!\n" + + "\fcontainer_id\x18\x02 \x01(\tR\vcontainerId\x12-\n" + + "\aprocess\x18\x03 \x01(\v2\x13.runtime.v1.ProcessR\aprocess\x121\n" + + "\x06action\x18\x04 \x01(\x0e2\x19.runtime.v1.ProcessActionR\x06action\"^\n" + + "\x10ProcessTreeEvent\x12\x18\n" + + "\ainitial\x18\x01 \x01(\bR\ainitial\x120\n" + + "\x06events\x18\x02 \x03(\v2\x18.runtime.v1.ProcessEventR\x06events*\xf0\x02\n" + + "\tEventType\x12\v\n" + + "\aUNKNOWN\x10\x00\x12\x0e\n" + + "\n" + + "EVENT_EXEC\x10\x01\x12\r\n" + + "\tEVENT_DNS\x10\x02\x12\x15\n" + + "\x11EVENT_TCP_CONNECT\x10\x03\x12\x1b\n" + + "\x17EVENT_TCP_CONNECT_ERROR\x10\x04\x12\x14\n" + + "\x10EVENT_TCP_LISTEN\x10\x05\x12\x15\n" + + "\x11EVENT_FILE_CHANGE\x10\x06\x12\x15\n" + + "\x11EVENT_PROCESS_OOM\x10\a\x12\x15\n" + + "\x11EVENT_MAGIC_WRITE\x10\b\x12\x13\n" + + "\x0fEVENT_SIGNATURE\x10\t\x12\x13\n" + + "\x0fEVENT_TTY_WRITE\x10\n" + + "\x12\x1a\n" + + "\x16EVENT_STDIO_VIA_SOCKET\x10\v\x12\r\n" + + "\tEVENT_SSH\x10\f\x12\x16\n" + + "\x12EVENT_PROCESS_FORK\x10\r\x12\x16\n" + + "\x12EVENT_PROCESS_EXIT\x10\x0e\x12\x13\n" + + "\x0fEVENT_FILE_OPEN\x10\x0f\x12\x0e\n" + + "\tEVENT_ANY\x10\xe7\a*\xcf\x01\n" + + "\fWorkloadKind\x12\x19\n" + + "\x15WORKLOAD_KIND_UNKNOWN\x10\x00\x12\x1c\n" + + "\x18WORKLOAD_KIND_DEPLOYMENT\x10\x01\x12\x1d\n" + + "\x19WORKLOAD_KIND_REPLICA_SET\x10\x02\x12\x1e\n" + + "\x1aWORKLOAD_KIND_STATEFUL_SET\x10\x03\x12\x15\n" + + "\x11WORKLOAD_KIND_JOB\x10\x04\x12\x19\n" + + "\x15WORKLOAD_KIND_CRONJOB\x10\x05\x12\x15\n" + + "\x11WORKLOAD_KIND_POD\x10\x06*\x90\x01\n" + + "\x0fImageScanStatus\x12\x1d\n" + + "\x19IMAGE_SCAN_STATUS_UNKNOWN\x10\x00\x12\x1d\n" + + "\x19IMAGE_SCAN_STATUS_SCANNED\x10\x01\x12\x1d\n" + + "\x19IMAGE_SCAN_STATUS_PENDING\x10\x02\x12 \n" + + "\x1cIMAGE_SCAN_STATUS_SCAN_ERROR\x10\x03*v\n" + + "\rProcessAction\x12\x1a\n" + + "\x16PROCESS_ACTION_UNKNOWN\x10\x00\x12\x17\n" + + "\x13PROCESS_ACTION_EXEC\x10\x01\x12\x17\n" + + "\x13PROCESS_ACTION_FORK\x10\x02\x12\x17\n" + + "\x13PROCESS_ACTION_EXIT\x10\x032\xfc\x05\n" + + "\x17RuntimeSecurityAgentAPI\x12_\n" + + "\x10GetConfiguration\x12#.runtime.v1.GetConfigurationRequest\x1a$.runtime.v1.GetConfigurationResponse\"\x00\x12L\n" + + "\x0fLogsWriteStream\x12\x14.runtime.v1.LogEvent\x1a\x1f.runtime.v1.WriteStreamResponse\"\x00(\x01\x12Y\n" + + "\x0eWriteDataBatch\x12!.runtime.v1.WriteDataBatchRequest\x1a\".runtime.v1.WriteDataBatchResponse\"\x00\x12S\n" + + "\fGetSyncState\x12\x1f.runtime.v1.GetSyncStateRequest\x1a .runtime.v1.GetSyncStateResponse\"\x00\x12\\\n" + + "\x0fUpdateSyncState\x12\".runtime.v1.UpdateSyncStateRequest\x1a#.runtime.v1.UpdateSyncStateResponse\"\x00\x12[\n" + + "\x13ImageMetadataIngest\x12\x19.runtime.v1.ImageMetadata\x1a'.runtime.v1.ImageMetadataIngestResponse\"\x00\x12a\n" + + "\x15KubeBenchReportIngest\x12\x1b.runtime.v1.KubeBenchReport\x1a).runtime.v1.KubeBenchReportIngestResponse\"\x00\x12d\n" + + "\x16KubeLinterReportIngest\x12\x1c.runtime.v1.KubeLinterReport\x1a*.runtime.v1.KubeLinterReportIngestResponse\"\x00B*Z(github.com/castai/kvisord/api/runtime/v1b\x06proto3" var ( file_api_v1_runtime_runtime_agent_api_proto_rawDescOnce sync.Once @@ -3060,7 +2984,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, 36) +var file_api_v1_runtime_runtime_agent_api_proto_msgTypes = make([]protoimpl.MessageInfo, 37) var file_api_v1_runtime_runtime_agent_api_proto_goTypes = []any{ (EventType)(0), // 0: runtime.v1.EventType (WorkloadKind)(0), // 1: runtime.v1.WorkloadKind @@ -3080,111 +3004,113 @@ var file_api_v1_runtime_runtime_agent_api_proto_goTypes = []any{ (*ContainerStats)(nil), // 15: runtime.v1.ContainerStats (*FilesAccessStats)(nil), // 16: runtime.v1.FilesAccessStats (*NodeStats)(nil), // 17: runtime.v1.NodeStats - (*ImageMetadata)(nil), // 18: runtime.v1.ImageMetadata - (*ImageMetadataIngestResponse)(nil), // 19: runtime.v1.ImageMetadataIngestResponse - (*GetSyncStateRequest)(nil), // 20: runtime.v1.GetSyncStateRequest - (*GetSyncStateResponse)(nil), // 21: runtime.v1.GetSyncStateResponse - (*ImagesSyncState)(nil), // 22: runtime.v1.ImagesSyncState - (*Image)(nil), // 23: runtime.v1.Image - (*UpdateSyncStateRequest)(nil), // 24: runtime.v1.UpdateSyncStateRequest - (*UpdateSyncStateResponse)(nil), // 25: runtime.v1.UpdateSyncStateResponse - (*KubeBenchReport)(nil), // 26: runtime.v1.KubeBenchReport - (*KubeBenchReportIngestResponse)(nil), // 27: runtime.v1.KubeBenchReportIngestResponse - (*KubeBenchNode)(nil), // 28: runtime.v1.KubeBenchNode - (*KubeBenchControls)(nil), // 29: runtime.v1.KubeBenchControls - (*KubeBenchGroup)(nil), // 30: runtime.v1.KubeBenchGroup - (*KubeBenchCheck)(nil), // 31: runtime.v1.KubeBenchCheck - (*KubeLinterReport)(nil), // 32: runtime.v1.KubeLinterReport - (*KubeLinterReportIngestResponse)(nil), // 33: runtime.v1.KubeLinterReportIngestResponse - (*KubeLinterCheck)(nil), // 34: runtime.v1.KubeLinterCheck - (*Process)(nil), // 35: runtime.v1.Process - (*ProcessEvent)(nil), // 36: runtime.v1.ProcessEvent - (*ProcessTreeEvent)(nil), // 37: runtime.v1.ProcessTreeEvent - nil, // 38: runtime.v1.ContainerEvents.ObjectLabelsEntry - nil, // 39: runtime.v1.ContainerEvents.ObjectAnnotationsEntry - (*Netflow)(nil), // 40: runtime.v1.Netflow - (*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 - (*ProcessFork)(nil), // 49: runtime.v1.ProcessFork - (*ProcessExit)(nil), // 50: runtime.v1.ProcessExit - (*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 + (*SustainabilityStats)(nil), // 18: runtime.v1.SustainabilityStats + (*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.ContainerEvents.ObjectLabelsEntry + nil, // 40: runtime.v1.ContainerEvents.ObjectAnnotationsEntry + (*Netflow)(nil), // 41: runtime.v1.Netflow + (*Exec)(nil), // 42: runtime.v1.Exec + (*DNS)(nil), // 43: runtime.v1.DNS + (*File)(nil), // 44: runtime.v1.File + (*Tuple)(nil), // 45: runtime.v1.Tuple + (*SignatureEvent)(nil), // 46: runtime.v1.SignatureEvent + (*Any)(nil), // 47: runtime.v1.Any + (*StdioViaSocketFinding)(nil), // 48: runtime.v1.StdioViaSocketFinding + (*SSHData)(nil), // 49: runtime.v1.SSHData + (*ProcessFork)(nil), // 50: runtime.v1.ProcessFork + (*ProcessExit)(nil), // 51: runtime.v1.ProcessExit + (*CpuStats)(nil), // 52: runtime.v1.CpuStats + (*MemoryStats)(nil), // 53: runtime.v1.MemoryStats + (*PidsStats)(nil), // 54: runtime.v1.PidsStats + (*IOStats)(nil), // 55: runtime.v1.IOStats + (*timestamppb.Timestamp)(nil), // 56: google.protobuf.Timestamp + (*LogEvent)(nil), // 57: runtime.v1.LogEvent } var file_api_v1_runtime_runtime_agent_api_proto_depIdxs = []int32{ 6, // 0: runtime.v1.WriteDataBatchRequest.items:type_name -> runtime.v1.DataBatchItem 15, // 1: runtime.v1.DataBatchItem.container_stats:type_name -> runtime.v1.ContainerStats 17, // 2: runtime.v1.DataBatchItem.node_stats:type_name -> runtime.v1.NodeStats 11, // 3: runtime.v1.DataBatchItem.container_events:type_name -> runtime.v1.ContainerEvents - 40, // 4: runtime.v1.DataBatchItem.netflow:type_name -> runtime.v1.Netflow - 37, // 5: runtime.v1.DataBatchItem.process_tree:type_name -> runtime.v1.ProcessTreeEvent - 9, // 6: runtime.v1.GetConfigurationResponse.config:type_name -> runtime.v1.Configuration - 1, // 7: runtime.v1.ContainerEvents.workload_kind:type_name -> runtime.v1.WorkloadKind - 38, // 8: runtime.v1.ContainerEvents.object_labels:type_name -> runtime.v1.ContainerEvents.ObjectLabelsEntry - 39, // 9: runtime.v1.ContainerEvents.object_annotations:type_name -> runtime.v1.ContainerEvents.ObjectAnnotationsEntry - 12, // 10: runtime.v1.ContainerEvents.items:type_name -> runtime.v1.ContainerEvent - 0, // 11: runtime.v1.ContainerEvent.event_type:type_name -> runtime.v1.EventType - 41, // 12: runtime.v1.ContainerEvent.exec:type_name -> runtime.v1.Exec - 42, // 13: runtime.v1.ContainerEvent.dns:type_name -> runtime.v1.DNS - 43, // 14: runtime.v1.ContainerEvent.file:type_name -> runtime.v1.File - 44, // 15: runtime.v1.ContainerEvent.tuple:type_name -> runtime.v1.Tuple - 45, // 16: runtime.v1.ContainerEvent.signature:type_name -> runtime.v1.SignatureEvent - 46, // 17: runtime.v1.ContainerEvent.any:type_name -> runtime.v1.Any - 47, // 18: runtime.v1.ContainerEvent.stdio_via_socket:type_name -> runtime.v1.StdioViaSocketFinding - 48, // 19: runtime.v1.ContainerEvent.ssh:type_name -> runtime.v1.SSHData - 49, // 20: runtime.v1.ContainerEvent.process_fork:type_name -> runtime.v1.ProcessFork - 50, // 21: runtime.v1.ContainerEvent.process_exit:type_name -> runtime.v1.ProcessExit - 51, // 22: runtime.v1.ContainerStats.cpu_stats:type_name -> runtime.v1.CpuStats - 52, // 23: runtime.v1.ContainerStats.memory_stats:type_name -> runtime.v1.MemoryStats - 53, // 24: runtime.v1.ContainerStats.pids_stats:type_name -> runtime.v1.PidsStats - 54, // 25: runtime.v1.ContainerStats.io_stats:type_name -> runtime.v1.IOStats - 16, // 26: runtime.v1.ContainerStats.files_access_stats:type_name -> runtime.v1.FilesAccessStats - 51, // 27: runtime.v1.NodeStats.cpu_stats:type_name -> runtime.v1.CpuStats - 52, // 28: runtime.v1.NodeStats.memory_stats:type_name -> runtime.v1.MemoryStats - 54, // 29: runtime.v1.NodeStats.io_stats:type_name -> runtime.v1.IOStats - 55, // 30: runtime.v1.ImageMetadata.created_at:type_name -> google.protobuf.Timestamp - 22, // 31: runtime.v1.GetSyncStateResponse.images:type_name -> runtime.v1.ImagesSyncState - 23, // 32: runtime.v1.ImagesSyncState.images:type_name -> runtime.v1.Image - 2, // 33: runtime.v1.Image.scan_status:type_name -> runtime.v1.ImageScanStatus - 23, // 34: runtime.v1.UpdateSyncStateRequest.images:type_name -> runtime.v1.Image - 29, // 35: runtime.v1.KubeBenchReport.controls:type_name -> runtime.v1.KubeBenchControls - 28, // 36: runtime.v1.KubeBenchReport.node:type_name -> runtime.v1.KubeBenchNode - 30, // 37: runtime.v1.KubeBenchControls.groups:type_name -> runtime.v1.KubeBenchGroup - 31, // 38: runtime.v1.KubeBenchGroup.checks:type_name -> runtime.v1.KubeBenchCheck - 34, // 39: runtime.v1.KubeLinterReport.checks:type_name -> runtime.v1.KubeLinterCheck - 35, // 40: runtime.v1.ProcessEvent.process:type_name -> runtime.v1.Process - 3, // 41: runtime.v1.ProcessEvent.action:type_name -> runtime.v1.ProcessAction - 36, // 42: runtime.v1.ProcessTreeEvent.events:type_name -> runtime.v1.ProcessEvent - 7, // 43: runtime.v1.RuntimeSecurityAgentAPI.GetConfiguration:input_type -> runtime.v1.GetConfigurationRequest - 56, // 44: runtime.v1.RuntimeSecurityAgentAPI.LogsWriteStream:input_type -> runtime.v1.LogEvent - 4, // 45: runtime.v1.RuntimeSecurityAgentAPI.WriteDataBatch:input_type -> runtime.v1.WriteDataBatchRequest - 20, // 46: runtime.v1.RuntimeSecurityAgentAPI.GetSyncState:input_type -> runtime.v1.GetSyncStateRequest - 24, // 47: runtime.v1.RuntimeSecurityAgentAPI.UpdateSyncState:input_type -> runtime.v1.UpdateSyncStateRequest - 18, // 48: runtime.v1.RuntimeSecurityAgentAPI.ImageMetadataIngest:input_type -> runtime.v1.ImageMetadata - 26, // 49: runtime.v1.RuntimeSecurityAgentAPI.KubeBenchReportIngest:input_type -> runtime.v1.KubeBenchReport - 32, // 50: runtime.v1.RuntimeSecurityAgentAPI.KubeLinterReportIngest:input_type -> runtime.v1.KubeLinterReport - 8, // 51: runtime.v1.RuntimeSecurityAgentAPI.GetConfiguration:output_type -> runtime.v1.GetConfigurationResponse - 13, // 52: runtime.v1.RuntimeSecurityAgentAPI.LogsWriteStream:output_type -> runtime.v1.WriteStreamResponse - 5, // 53: runtime.v1.RuntimeSecurityAgentAPI.WriteDataBatch:output_type -> runtime.v1.WriteDataBatchResponse - 21, // 54: runtime.v1.RuntimeSecurityAgentAPI.GetSyncState:output_type -> runtime.v1.GetSyncStateResponse - 25, // 55: runtime.v1.RuntimeSecurityAgentAPI.UpdateSyncState:output_type -> runtime.v1.UpdateSyncStateResponse - 19, // 56: runtime.v1.RuntimeSecurityAgentAPI.ImageMetadataIngest:output_type -> runtime.v1.ImageMetadataIngestResponse - 27, // 57: runtime.v1.RuntimeSecurityAgentAPI.KubeBenchReportIngest:output_type -> runtime.v1.KubeBenchReportIngestResponse - 33, // 58: runtime.v1.RuntimeSecurityAgentAPI.KubeLinterReportIngest:output_type -> runtime.v1.KubeLinterReportIngestResponse - 51, // [51:59] is the sub-list for method output_type - 43, // [43:51] is the sub-list for method input_type - 43, // [43:43] is the sub-list for extension type_name - 43, // [43:43] is the sub-list for extension extendee - 0, // [0:43] is the sub-list for field type_name + 41, // 4: runtime.v1.DataBatchItem.netflow:type_name -> runtime.v1.Netflow + 38, // 5: runtime.v1.DataBatchItem.process_tree:type_name -> runtime.v1.ProcessTreeEvent + 18, // 6: runtime.v1.DataBatchItem.sustainability_stats:type_name -> runtime.v1.SustainabilityStats + 9, // 7: runtime.v1.GetConfigurationResponse.config:type_name -> runtime.v1.Configuration + 1, // 8: runtime.v1.ContainerEvents.workload_kind:type_name -> runtime.v1.WorkloadKind + 39, // 9: runtime.v1.ContainerEvents.object_labels:type_name -> runtime.v1.ContainerEvents.ObjectLabelsEntry + 40, // 10: runtime.v1.ContainerEvents.object_annotations:type_name -> runtime.v1.ContainerEvents.ObjectAnnotationsEntry + 12, // 11: runtime.v1.ContainerEvents.items:type_name -> runtime.v1.ContainerEvent + 0, // 12: runtime.v1.ContainerEvent.event_type:type_name -> runtime.v1.EventType + 42, // 13: runtime.v1.ContainerEvent.exec:type_name -> runtime.v1.Exec + 43, // 14: runtime.v1.ContainerEvent.dns:type_name -> runtime.v1.DNS + 44, // 15: runtime.v1.ContainerEvent.file:type_name -> runtime.v1.File + 45, // 16: runtime.v1.ContainerEvent.tuple:type_name -> runtime.v1.Tuple + 46, // 17: runtime.v1.ContainerEvent.signature:type_name -> runtime.v1.SignatureEvent + 47, // 18: runtime.v1.ContainerEvent.any:type_name -> runtime.v1.Any + 48, // 19: runtime.v1.ContainerEvent.stdio_via_socket:type_name -> runtime.v1.StdioViaSocketFinding + 49, // 20: runtime.v1.ContainerEvent.ssh:type_name -> runtime.v1.SSHData + 50, // 21: runtime.v1.ContainerEvent.process_fork:type_name -> runtime.v1.ProcessFork + 51, // 22: runtime.v1.ContainerEvent.process_exit:type_name -> runtime.v1.ProcessExit + 52, // 23: runtime.v1.ContainerStats.cpu_stats:type_name -> runtime.v1.CpuStats + 53, // 24: runtime.v1.ContainerStats.memory_stats:type_name -> runtime.v1.MemoryStats + 54, // 25: runtime.v1.ContainerStats.pids_stats:type_name -> runtime.v1.PidsStats + 55, // 26: runtime.v1.ContainerStats.io_stats:type_name -> runtime.v1.IOStats + 16, // 27: runtime.v1.ContainerStats.files_access_stats:type_name -> runtime.v1.FilesAccessStats + 52, // 28: runtime.v1.NodeStats.cpu_stats:type_name -> runtime.v1.CpuStats + 53, // 29: runtime.v1.NodeStats.memory_stats:type_name -> runtime.v1.MemoryStats + 55, // 30: runtime.v1.NodeStats.io_stats:type_name -> runtime.v1.IOStats + 56, // 31: runtime.v1.ImageMetadata.created_at:type_name -> google.protobuf.Timestamp + 23, // 32: runtime.v1.GetSyncStateResponse.images:type_name -> runtime.v1.ImagesSyncState + 24, // 33: runtime.v1.ImagesSyncState.images:type_name -> runtime.v1.Image + 2, // 34: runtime.v1.Image.scan_status:type_name -> runtime.v1.ImageScanStatus + 24, // 35: runtime.v1.UpdateSyncStateRequest.images:type_name -> runtime.v1.Image + 30, // 36: runtime.v1.KubeBenchReport.controls:type_name -> runtime.v1.KubeBenchControls + 29, // 37: runtime.v1.KubeBenchReport.node:type_name -> runtime.v1.KubeBenchNode + 31, // 38: runtime.v1.KubeBenchControls.groups:type_name -> runtime.v1.KubeBenchGroup + 32, // 39: runtime.v1.KubeBenchGroup.checks:type_name -> runtime.v1.KubeBenchCheck + 35, // 40: runtime.v1.KubeLinterReport.checks:type_name -> runtime.v1.KubeLinterCheck + 36, // 41: runtime.v1.ProcessEvent.process:type_name -> runtime.v1.Process + 3, // 42: runtime.v1.ProcessEvent.action:type_name -> runtime.v1.ProcessAction + 37, // 43: runtime.v1.ProcessTreeEvent.events:type_name -> runtime.v1.ProcessEvent + 7, // 44: runtime.v1.RuntimeSecurityAgentAPI.GetConfiguration:input_type -> runtime.v1.GetConfigurationRequest + 57, // 45: runtime.v1.RuntimeSecurityAgentAPI.LogsWriteStream:input_type -> runtime.v1.LogEvent + 4, // 46: runtime.v1.RuntimeSecurityAgentAPI.WriteDataBatch:input_type -> runtime.v1.WriteDataBatchRequest + 21, // 47: runtime.v1.RuntimeSecurityAgentAPI.GetSyncState:input_type -> runtime.v1.GetSyncStateRequest + 25, // 48: runtime.v1.RuntimeSecurityAgentAPI.UpdateSyncState:input_type -> runtime.v1.UpdateSyncStateRequest + 19, // 49: runtime.v1.RuntimeSecurityAgentAPI.ImageMetadataIngest:input_type -> runtime.v1.ImageMetadata + 27, // 50: runtime.v1.RuntimeSecurityAgentAPI.KubeBenchReportIngest:input_type -> runtime.v1.KubeBenchReport + 33, // 51: runtime.v1.RuntimeSecurityAgentAPI.KubeLinterReportIngest:input_type -> runtime.v1.KubeLinterReport + 8, // 52: runtime.v1.RuntimeSecurityAgentAPI.GetConfiguration:output_type -> runtime.v1.GetConfigurationResponse + 13, // 53: runtime.v1.RuntimeSecurityAgentAPI.LogsWriteStream:output_type -> runtime.v1.WriteStreamResponse + 5, // 54: runtime.v1.RuntimeSecurityAgentAPI.WriteDataBatch:output_type -> runtime.v1.WriteDataBatchResponse + 22, // 55: runtime.v1.RuntimeSecurityAgentAPI.GetSyncState:output_type -> runtime.v1.GetSyncStateResponse + 26, // 56: runtime.v1.RuntimeSecurityAgentAPI.UpdateSyncState:output_type -> runtime.v1.UpdateSyncStateResponse + 20, // 57: runtime.v1.RuntimeSecurityAgentAPI.ImageMetadataIngest:output_type -> runtime.v1.ImageMetadataIngestResponse + 28, // 58: runtime.v1.RuntimeSecurityAgentAPI.KubeBenchReportIngest:output_type -> runtime.v1.KubeBenchReportIngestResponse + 34, // 59: runtime.v1.RuntimeSecurityAgentAPI.KubeLinterReportIngest:output_type -> runtime.v1.KubeLinterReportIngestResponse + 52, // [52:60] is the sub-list for method output_type + 44, // [44:52] is the sub-list for method input_type + 44, // [44:44] is the sub-list for extension type_name + 44, // [44:44] is the sub-list for extension extendee + 0, // [0:44] is the sub-list for field type_name } func init() { file_api_v1_runtime_runtime_agent_api_proto_init() } @@ -3199,6 +3125,7 @@ func file_api_v1_runtime_runtime_agent_api_proto_init() { (*DataBatchItem_ContainerEvents)(nil), (*DataBatchItem_Netflow)(nil), (*DataBatchItem_ProcessTree)(nil), + (*DataBatchItem_SustainabilityStats)(nil), } file_api_v1_runtime_runtime_agent_api_proto_msgTypes[3].OneofWrappers = []any{ (*GetConfigurationRequest_Controller)(nil), @@ -3222,7 +3149,7 @@ func file_api_v1_runtime_runtime_agent_api_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_api_v1_runtime_runtime_agent_api_proto_rawDesc), len(file_api_v1_runtime_runtime_agent_api_proto_rawDesc)), NumEnums: 4, - NumMessages: 36, + NumMessages: 37, NumExtensions: 0, NumServices: 1, }, diff --git a/api/v1/runtime/runtime_agent_api.proto b/api/v1/runtime/runtime_agent_api.proto index 5f7b02a4..0b96e16e 100644 --- a/api/v1/runtime/runtime_agent_api.proto +++ b/api/v1/runtime/runtime_agent_api.proto @@ -36,6 +36,7 @@ message DataBatchItem { ContainerEvents container_events = 12; Netflow netflow = 13; ProcessTreeEvent process_tree = 14; + SustainabilityStats sustainability_stats = 15; } } @@ -164,6 +165,25 @@ message NodeStats { IOStats io_stats = 23; } +message SustainabilityStats { + string namespace = 1; + string pod_name = 2; + string container_name = 3; + string node_name = 4; + // Energy consumption in Joules + double energy_joules = 5; + // Carbon emissions in grams of CO2 equivalent + double carbon_grams_co2e = 6; + // Energy cost in USD + double cost_usd = 7; + // Carbon intensity factor used (gCO2e/kWh) + double carbon_intensity_gco2_per_kwh = 8; + // Energy price factor used (USD/kWh) + double energy_price_usd_per_kwh = 9; + // Timestamp when the energy was measured + int64 timestamp = 10; +} + message ImageMetadata { string image_name = 1; string image_id = 2; diff --git a/api/v1/runtime/runtime_agent_api_grpc.pb.go b/api/v1/runtime/runtime_agent_api_grpc.pb.go index 425c5cb6..be06d716 100644 --- a/api/v1/runtime/runtime_agent_api_grpc.pb.go +++ b/api/v1/runtime/runtime_agent_api_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.3 +// - protoc v6.32.0 // source: api/v1/runtime/runtime_agent_api.proto package v1 diff --git a/charts/kvisor/templates/agent.yaml b/charts/kvisor/templates/agent.yaml index 7781c9ea..2603b6ee 100644 --- a/charts/kvisor/templates/agent.yaml +++ b/charts/kvisor/templates/agent.yaml @@ -75,6 +75,10 @@ spec: - "--clickhouse-username={{.Values.clickhouse.auth.username}}" {{- end }} - "--kube-api-service-addr={{ include "kvisor.controller.fullname" .}}.{{.Release.Namespace}}:{{ .Values.controller.kubeAPIListenPort }}" + {{- if .Values.agent.sustainability.enabled }} + - "--sustainability-enabled={{ .Values.agent.sustainability.enabled }}" + - "--sustainability-kepler-endpoint={{ .Values.agent.sustainability.keplerEndpoint }}" + {{- end }} {{- range $key, $value := .Values.agent.extraArgs }} - "--{{ $key }}={{ $value }}" {{- end }} @@ -152,6 +156,60 @@ spec: - name: containerd-sock mountPath: /run/containerd/containerd.sock readOnly: true + {{- if .Values.agent.sustainability.enabled }} + # Kepler sidecar container for energy monitoring + - name: kepler + image: "quay.io/sustainable_computing_io/kepler:latest" + imagePullPolicy: {{ .Values.image.pullPolicy }} + securityContext: + privileged: false + readOnlyRootFilesystem: false + allowPrivilegeEscalation: false + capabilities: + add: + - SYS_ADMIN + drop: + - ALL + resources: + requests: + cpu: 100m + memory: 128Mi + command: + - /usr/bin/kepler + env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: KEPLER_LOG_LEVEL + value: "1" + - name: KEPLER_ENABLE_FAKE_CPU_METER + value: "true" + ports: + - containerPort: 8888 + name: kepler-metrics + protocol: TCP + volumeMounts: + - name: lib-modules + mountPath: /lib/modules + readOnly: true + - name: usr-src + mountPath: /usr/src + readOnly: true + - name: boot + mountPath: /boot + readOnly: true + - name: proc + mountPath: /proc + readOnly: true + - name: sys + mountPath: /sys + readOnly: true + - name: kepler-config + mountPath: /etc/kepler/config.yaml + subPath: config.yaml + readOnly: true + {{- end }} dnsPolicy: {{.Values.agent.dnsPolicy}} {{- with .Values.agent.nodeSelector }} nodeSelector: @@ -182,6 +240,27 @@ spec: hostPath: path: /run/containerd/containerd.sock type: Socket + {{- if .Values.agent.sustainability.enabled }} + # Kepler + - name: lib-modules + hostPath: + path: /lib/modules + - name: usr-src + hostPath: + path: /usr/src + - name: boot + hostPath: + path: /boot + - name: proc + hostPath: + path: /proc + - name: sys + hostPath: + path: /sys + - name: kepler-config + configMap: + name: kepler-config + {{- end }} {{- end }} --- {{- if .Values.agent.serviceAccount.create -}} @@ -263,3 +342,48 @@ spec: - {{ .Values.agent.priorityClass }} {{- end }} {{- end }} +{{- if .Values.agent.sustainability.enabled }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ include "kvisor.agent.fullname" . }}-kepler + namespace: {{ .Release.Namespace }} + labels: + {{- include "kvisor.agent.labels" . | nindent 4 }} + app.kubernetes.io/component: kepler +spec: + ports: + - name: kepler-metrics + port: 8888 + protocol: TCP + targetPort: kepler-metrics + selector: + {{- include "kvisor.agent.selectorLabels" . | nindent 4 }} + type: ClusterIP +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: kepler-config + namespace: {{ .Release.Namespace }} +data: + config.yaml: | + cpu-estimator-address: "" + dram-estimator-address: "" + other-estimator-address: "" + uncore-estimator-address: "" + gpu-estimator-address: "" + enabledGPU: false + cpu: + msr: + enabled: false + acpi: + enabled: false + gpu: + nvml: + enabled: false + dcgm: + enabled: false + use-fake-cpu-power: false +{{- end }} diff --git a/charts/kvisor/values-local.yaml b/charts/kvisor/values-local.yaml index fc2a15bf..017f21b7 100644 --- a/charts/kvisor/values-local.yaml +++ b/charts/kvisor/values-local.yaml @@ -38,6 +38,10 @@ agent: prometheusScrape: enabled: true + sustainability: + enabled: true + keplerEndpoint: "http://localhost:8888/metrics" + containerSecurityContext: readOnlyRootFilesystem: false diff --git a/charts/kvisor/values.yaml b/charts/kvisor/values.yaml index 92a47900..3ace0abe 100644 --- a/charts/kvisor/values.yaml +++ b/charts/kvisor/values.yaml @@ -128,6 +128,10 @@ agent: metricsHTTPListenPort: 6060 + sustainability: + enabled: true + keplerEndpoint: "http://localhost:8888/metrics" + # Extra args for egressd collector container. extraArgs: log-level: info diff --git a/cmd/agent/daemon/app/app.go b/cmd/agent/daemon/app/app.go index 16e844e6..3d74b85b 100644 --- a/cmd/agent/daemon/app/app.go +++ b/cmd/agent/daemon/app/app.go @@ -240,11 +240,12 @@ func (a *App) Run(ctx context.Context) error { ctrl := pipeline.NewController( log, pipeline.Config{ - Netflow: cfg.Netflow, - Events: cfg.Events, - Stats: cfg.Stats, - ProcessTree: cfg.ProcessTree, - DataBatch: cfg.DataBatch, + Netflow: cfg.Netflow, + Events: cfg.Events, + Stats: cfg.Stats, + ProcessTree: cfg.ProcessTree, + Sustainability: cfg.Sustainability, + DataBatch: cfg.DataBatch, }, exporters, containersClient, diff --git a/cmd/agent/daemon/clickhouse_init.go b/cmd/agent/daemon/clickhouse_init.go index 130f27a9..0bb94ae5 100644 --- a/cmd/agent/daemon/clickhouse_init.go +++ b/cmd/agent/daemon/clickhouse_init.go @@ -56,7 +56,9 @@ func NewClickhouseInitCommand() *cobra.Command { if err := conn.Exec(ctx, clickhouseexport.ClickhouseProcessTreeSchema()); err != nil { return fmt.Errorf("creating clickhouse process tree schema: %w", err) } - + if err := conn.Exec(ctx, clickhouseexport.ClickhouseSustainabilityStatsSchema()); err != nil { + return fmt.Errorf("creating clickhouse sustainability stats schema: %w", err) + } return nil } diff --git a/cmd/agent/daemon/config/config.go b/cmd/agent/daemon/config/config.go index 30e8f5c0..866b53fe 100644 --- a/cmd/agent/daemon/config/config.go +++ b/cmd/agent/daemon/config/config.go @@ -42,6 +42,7 @@ type Config struct { EnricherConfig EnricherConfig `json:"enricherConfig"` Netflow NetflowConfig `json:"netflow"` ProcessTree ProcessTreeConfig `json:"processTree"` + Sustainability SustainabilityConfig `json:"sustainability"` Clickhouse ClickhouseConfig `json:"clickhouse"` KubeAPIServiceAddr string `json:"kubeAPIServiceAddr"` ExportersQueueSize int `validate:"required" json:"exportersQueueSize"` @@ -98,3 +99,8 @@ type ClickhouseConfig struct { type ProcessTreeConfig struct { Enabled bool `json:"enabled"` } + +type SustainabilityConfig struct { + Enabled bool `json:"enabled"` + KeplerEndpoint string `json:"keplerEndpoint"` +} diff --git a/cmd/agent/daemon/daemon.go b/cmd/agent/daemon/daemon.go index f0fe8486..a6334b8d 100644 --- a/cmd/agent/daemon/daemon.go +++ b/cmd/agent/daemon/daemon.go @@ -88,6 +88,9 @@ func NewRunCommand(version string) *cobra.Command { processTreeEnabled = command.Flags().Bool("process-tree-enabled", false, "Enables process tree tracking") + sustainabilityEnabled = command.Flags().Bool("sustainability-enabled", false, "Enables sustainability metrics collection") + sustainabilityKeplerEndpoint = command.Flags().String("sustainability-kepler-endpoint", "http://localhost:8888/metrics", "Kepler metrics endpoint URL") + dataBatchMaxSize = command.Flags().Uint32("data-batch-max-size", 524288, "Data batch max size in bytes (before compression)") dataBatchFlushInterval = command.Flags().Duration("data-batch-flush-interval", 15*time.Second, "Data batch flush interval. Data is flushed periodically if data batch size is not reached") dataBatchExportTimeout = command.Flags().Duration("data-batch-export-timeout", 10*time.Second, "Data batch export timeout") @@ -210,6 +213,10 @@ func NewRunCommand(version string) *cobra.Command { ProcessTree: config.ProcessTreeConfig{ Enabled: *processTreeEnabled, }, + Sustainability: config.SustainabilityConfig{ + Enabled: *sustainabilityEnabled, + KeplerEndpoint: *sustainabilityKeplerEndpoint, + }, KubeAPIServiceAddr: *kubeAPIServiceAddr, ExportersQueueSize: *exportersQueueSize, AutomountCgroupv2: *automountCgroupv2, diff --git a/cmd/agent/daemon/export/clickhouse/clickhouse_databatch_writer.go b/cmd/agent/daemon/export/clickhouse/clickhouse_databatch_writer.go index 0fb09976..c567be32 100644 --- a/cmd/agent/daemon/export/clickhouse/clickhouse_databatch_writer.go +++ b/cmd/agent/daemon/export/clickhouse/clickhouse_databatch_writer.go @@ -30,11 +30,14 @@ func (d *dataBatchWriter) Name() string { func (d *dataBatchWriter) Write(ctx context.Context, req *castaipb.WriteDataBatchRequest) error { var netflows []*castaipb.Netflow var events []*castaipb.ContainerEvents + var sustainabilityStats []*castaipb.SustainabilityStats for _, item := range req.Items { if v := item.GetContainerEvents(); v != nil { events = append(events, v) } else if v := item.GetNetflow(); v != nil { netflows = append(netflows, v) + } else if v := item.GetSustainabilityStats(); v != nil { + sustainabilityStats = append(sustainabilityStats, v) } } @@ -48,6 +51,11 @@ func (d *dataBatchWriter) Write(ctx context.Context, req *castaipb.WriteDataBatc return err } } + for _, s := range sustainabilityStats { + if err := d.insertSustainabilityStats(ctx, s); err != nil { + return err + } + } return nil } @@ -157,6 +165,24 @@ func (d *dataBatchWriter) insertEventsGroup(ctx context.Context, group *castaipb return nil } +func (d *dataBatchWriter) insertSustainabilityStats(ctx context.Context, stats *castaipb.SustainabilityStats) error { + return d.conn.AsyncInsert( + ctx, + sustainabilityStatsInsertQuery, + true, + time.UnixMicro(int64(stats.Timestamp)/1000), + stats.Namespace, + stats.PodName, + stats.ContainerName, + stats.NodeName, + stats.EnergyJoules, + stats.CarbonGramsCo2E, + stats.CostUsd, + stats.CarbonIntensityGco2PerKwh, + stats.EnergyPriceUsdPerKwh, + ) +} + func shouldAddEvent(e *castaipb.ContainerEvent) bool { switch e.EventType { case castaipb.EventType_EVENT_PROCESS_FORK, castaipb.EventType_EVENT_PROCESS_EXIT: @@ -223,6 +249,22 @@ var netflowInsertQuery = newInsertQueryTemplate(tableConfig{ }, }) +var sustainabilityStatsInsertQuery = newInsertQueryTemplate(tableConfig{ + name: "sustainability_stats", + columns: []string{ + "ts", + "namespace", + "pod_name", + "container_name", + "node_name", + "energy_joules", + "carbon_grams_co2e", + "cost_usd", + "carbon_intensity_gco2_per_kwh", + "energy_price_usd_per_kwh", + }, +}) + type tableConfig struct { name string columns []string diff --git a/cmd/agent/daemon/export/clickhouse/schemas.go b/cmd/agent/daemon/export/clickhouse/schemas.go index 210b6996..fb62beb3 100644 --- a/cmd/agent/daemon/export/clickhouse/schemas.go +++ b/cmd/agent/daemon/export/clickhouse/schemas.go @@ -76,3 +76,24 @@ func ClickhouseContainerEventsSchema() string { TTL toDateTime(ts) + INTERVAL 24 HOUR; ` } + +func ClickhouseSustainabilityStatsSchema() string { + return ` +CREATE TABLE IF NOT EXISTS sustainability_stats +( + ts DateTime64(9, 'UTC'), + namespace LowCardinality(String) CODEC(ZSTD(1)), + pod_name LowCardinality(String) CODEC(ZSTD(1)), + container_name LowCardinality(String) CODEC(ZSTD(1)), + node_name LowCardinality(String) CODEC(ZSTD(1)), + energy_joules Float64, + carbon_grams_co2e Float64, + cost_usd Float64, + carbon_intensity_gco2_per_kwh Float64, + energy_price_usd_per_kwh Float64 +) +ENGINE = MergeTree() +ORDER BY (ts, namespace, container_name) +TTL toDateTime(ts) + INTERVAL 24 HOUR; +` +} diff --git a/cmd/agent/daemon/metrics/agent.go b/cmd/agent/daemon/metrics/agent.go index bde17db2..9c5fc691 100644 --- a/cmd/agent/daemon/metrics/agent.go +++ b/cmd/agent/daemon/metrics/agent.go @@ -17,6 +17,7 @@ const ( PipelineNetflows string = "netflows" PipelineStats string = "stats" PipelineInitialProcessTree string = "initial_process_tree" + PipelineSustainability string = "sustainability" ) var ( diff --git a/cmd/agent/daemon/pipeline/controller.go b/cmd/agent/daemon/pipeline/controller.go index 8b4e90df..754cf84e 100644 --- a/cmd/agent/daemon/pipeline/controller.go +++ b/cmd/agent/daemon/pipeline/controller.go @@ -30,11 +30,12 @@ import ( ) type Config struct { - DataBatch config.DataBatchConfig `validate:"required"` - Netflow config.NetflowConfig `validate:"required"` - Events config.EventsConfig `validate:"required"` - Stats config.StatsConfig `validate:"required"` - ProcessTree config.ProcessTreeConfig `validate:"required"` + DataBatch config.DataBatchConfig `validate:"required"` + Netflow config.NetflowConfig `validate:"required"` + Events config.EventsConfig `validate:"required"` + Stats config.StatsConfig `validate:"required"` + ProcessTree config.ProcessTreeConfig `validate:"required"` + Sustainability config.SustainabilityConfig `validate:"required"` } type containersClient interface { @@ -215,6 +216,12 @@ func (c *Controller) Run(ctx context.Context) error { }) } + if c.cfg.Sustainability.Enabled { + errg.Go(func() error { + return c.runSustainabilityPipeline(ctx) + }) + } + return errg.Wait() } diff --git a/cmd/agent/daemon/pipeline/sustainability_pipeline.go b/cmd/agent/daemon/pipeline/sustainability_pipeline.go new file mode 100644 index 00000000..c3614179 --- /dev/null +++ b/cmd/agent/daemon/pipeline/sustainability_pipeline.go @@ -0,0 +1,50 @@ +package pipeline + +import ( + "context" + "time" + + castaipb "github.com/castai/kvisor/api/v1/runtime" + "github.com/castai/kvisor/cmd/agent/daemon/metrics" + "github.com/castai/kvisor/cmd/agent/daemon/sustainability" +) + +func (c *Controller) runSustainabilityPipeline(ctx context.Context) error { + c.log.Info("running sustainability pipeline") + defer c.log.Info("sustainability pipeline done") + + scraper := sustainability.NewScraper(c.cfg.Sustainability.KeplerEndpoint) + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-ticker.C: + start := time.Now() + stats, err := scraper.ScrapeMetrics() + if err != nil { + c.log.Warnf("failed to scrape sustainability metrics: %v", err) + continue + } + + if len(stats) == 0 { + c.log.Debug("no sustainability stats scraped") + continue + } + + items := make([]*castaipb.DataBatchItem, 0, len(stats)) + for _, stat := range stats { + items = append(items, &castaipb.DataBatchItem{ + Data: &castaipb.DataBatchItem_SustainabilityStats{ + SustainabilityStats: stat, + }, + }) + } + + c.sendDataBatch("sustainability stats scrape", metrics.PipelineSustainability, items) + c.log.Debugf("sustainability stats exported, count=%d, duration=%v", len(stats), time.Since(start)) + } + } +} diff --git a/cmd/agent/daemon/sustainability/scraper.go b/cmd/agent/daemon/sustainability/scraper.go new file mode 100644 index 00000000..f7f04c82 --- /dev/null +++ b/cmd/agent/daemon/sustainability/scraper.go @@ -0,0 +1,107 @@ +package sustainability + +import ( + "fmt" + "io" + "net/http" + "time" + + castaipb "github.com/castai/kvisor/api/v1/runtime" + prom "github.com/prometheus/client_model/go" + "github.com/prometheus/common/expfmt" +) + +type Scraper struct { + keplerEndpoint string + httpClient *http.Client +} + +func NewScraper(keplerEndpoint string) *Scraper { + return &Scraper{ + keplerEndpoint: keplerEndpoint, + httpClient: &http.Client{ + Timeout: 10 * time.Second, + }, + } +} + +func (s *Scraper) ScrapeMetrics() ([]*castaipb.SustainabilityStats, error) { + resp, err := s.httpClient.Get(s.keplerEndpoint) + if err != nil { + return nil, fmt.Errorf("failed to fetch kepler metrics: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("kepler endpoint returned status %d", resp.StatusCode) + } + + return s.parsePrometheusMetrics(resp.Body) +} + +func (s *Scraper) parsePrometheusMetrics(r io.Reader) ([]*castaipb.SustainabilityStats, error) { + var parser expfmt.TextParser + metricFamilies, err := parser.TextToMetricFamilies(r) + if err != nil { + return nil, fmt.Errorf("failed to parse metrics: %w", err) + } + + var stats []*castaipb.SustainabilityStats + timestamp := time.Now().UnixNano() + + energyFamily, exists := metricFamilies[KeplerContainerEnergyJoulesMetric] + if !exists { + return stats, nil + } + + for _, metric := range energyFamily.GetMetric() { + stat, err := s.convertMetricToSustainabilityStats(metric, timestamp) + if err != nil { + continue + } + stats = append(stats, stat) + } + + return stats, nil +} + +func (s *Scraper) convertMetricToSustainabilityStats(metric *prom.Metric, timestamp int64) (*castaipb.SustainabilityStats, error) { + labels := make(map[string]string) + for _, label := range metric.GetLabel() { + labels[label.GetName()] = label.GetValue() + } + + namespace := labels["pod_namespace"] + podName := labels["pod_name"] + containerName := labels["container_name"] + nodeName := labels["instance"] + + if namespace == "" || podName == "" || containerName == "" { + return nil, fmt.Errorf("missing required labels") + } + + var value float64 + if metric.GetCounter() != nil { + value = metric.GetCounter().GetValue() + } else if metric.GetGauge() != nil { + value = metric.GetGauge().GetValue() + } else { + return nil, fmt.Errorf("unsupported metric type") + } + + carbonGramsCo2E := CalculateCarbonEmissions(value, DefaultCarbonIntensityGCO2PerKWh) + costUsd := CalculateEnergyCost(value, DefaultEnergyPriceUSDPerKWh) + + return &castaipb.SustainabilityStats{ + Namespace: namespace, + PodName: podName, + ContainerName: containerName, + NodeName: nodeName, + EnergyJoules: value, + CarbonGramsCo2E: carbonGramsCo2E, + CostUsd: costUsd, + CarbonIntensityGco2PerKwh: DefaultCarbonIntensityGCO2PerKWh, + EnergyPriceUsdPerKwh: DefaultEnergyPriceUSDPerKWh, + Timestamp: timestamp, + }, nil +} diff --git a/cmd/agent/daemon/sustainability/types.go b/cmd/agent/daemon/sustainability/types.go new file mode 100644 index 00000000..8d1e37cb --- /dev/null +++ b/cmd/agent/daemon/sustainability/types.go @@ -0,0 +1,30 @@ +package sustainability + +const ( + KeplerContainerEnergyJoulesMetric = "kepler_container_energy_joules" +) + +// Sustainability calculation constants +const ( + // DefaultCarbonIntensityGCO2PerKWh represents the carbon intensity in grams of CO2 equivalent per kWh + // This is a global average value - for demo purposes only + DefaultCarbonIntensityGCO2PerKWh = 475.0 + + // DefaultEnergyPriceUSDPerKWh represents the default energy price in USD per kWh + // This is an average value - for demo purposes only + DefaultEnergyPriceUSDPerKWh = 0.165 + + // JoulesToKWhConversionFactor converts Joules to kilowatt-hours + // 1 kWh = 3,600,000 Joules + JoulesToKWhConversionFactor = 3_600_000.0 +) + +// CalculateCarbonEmissions calculates carbon emissions in grams of CO2 equivalent +func CalculateCarbonEmissions(energyJoules, carbonIntensityGCO2PerKWh float64) float64 { + return (energyJoules / JoulesToKWhConversionFactor) * carbonIntensityGCO2PerKWh +} + +// CalculateEnergyCost calculates energy cost in USD +func CalculateEnergyCost(energyJoules, energyPriceUSDPerKWh float64) float64 { + return (energyJoules / JoulesToKWhConversionFactor) * energyPriceUSDPerKWh +} From 75158320a698c5c4b0b7e2c5fd1634e318b5b48d Mon Sep 17 00:00:00 2001 From: tautvydasliekis Date: Fri, 29 Aug 2025 08:27:04 +0300 Subject: [PATCH 2/6] feat: Make sustainability scrape interval configurable --- charts/kvisor/templates/agent.yaml | 3 +++ charts/kvisor/values-local.yaml | 1 + charts/kvisor/values.yaml | 1 + cmd/agent/daemon/config/config.go | 5 +++-- cmd/agent/daemon/daemon.go | 2 ++ cmd/agent/daemon/pipeline/sustainability_pipeline.go | 2 +- 6 files changed, 11 insertions(+), 3 deletions(-) diff --git a/charts/kvisor/templates/agent.yaml b/charts/kvisor/templates/agent.yaml index 2603b6ee..00dd5a6c 100644 --- a/charts/kvisor/templates/agent.yaml +++ b/charts/kvisor/templates/agent.yaml @@ -78,6 +78,9 @@ spec: {{- if .Values.agent.sustainability.enabled }} - "--sustainability-enabled={{ .Values.agent.sustainability.enabled }}" - "--sustainability-kepler-endpoint={{ .Values.agent.sustainability.keplerEndpoint }}" + {{- if .Values.agent.sustainability.scrapeInterval }} + - "--sustainability-scrape-interval={{ .Values.agent.sustainability.scrapeInterval }}" + {{- end }} {{- end }} {{- range $key, $value := .Values.agent.extraArgs }} - "--{{ $key }}={{ $value }}" diff --git a/charts/kvisor/values-local.yaml b/charts/kvisor/values-local.yaml index 017f21b7..47e9e4b6 100644 --- a/charts/kvisor/values-local.yaml +++ b/charts/kvisor/values-local.yaml @@ -41,6 +41,7 @@ agent: sustainability: enabled: true keplerEndpoint: "http://localhost:8888/metrics" + scrapeInterval: "10s" containerSecurityContext: readOnlyRootFilesystem: false diff --git a/charts/kvisor/values.yaml b/charts/kvisor/values.yaml index 3ace0abe..147c3288 100644 --- a/charts/kvisor/values.yaml +++ b/charts/kvisor/values.yaml @@ -131,6 +131,7 @@ agent: sustainability: enabled: true keplerEndpoint: "http://localhost:8888/metrics" + scrapeInterval: "30s" # Extra args for egressd collector container. extraArgs: diff --git a/cmd/agent/daemon/config/config.go b/cmd/agent/daemon/config/config.go index 866b53fe..9c1ea800 100644 --- a/cmd/agent/daemon/config/config.go +++ b/cmd/agent/daemon/config/config.go @@ -101,6 +101,7 @@ type ProcessTreeConfig struct { } type SustainabilityConfig struct { - Enabled bool `json:"enabled"` - KeplerEndpoint string `json:"keplerEndpoint"` + Enabled bool `json:"enabled"` + KeplerEndpoint string `json:"keplerEndpoint"` + ScrapeInterval time.Duration `json:"scrapeInterval"` } diff --git a/cmd/agent/daemon/daemon.go b/cmd/agent/daemon/daemon.go index a6334b8d..8b72107a 100644 --- a/cmd/agent/daemon/daemon.go +++ b/cmd/agent/daemon/daemon.go @@ -90,6 +90,7 @@ func NewRunCommand(version string) *cobra.Command { sustainabilityEnabled = command.Flags().Bool("sustainability-enabled", false, "Enables sustainability metrics collection") sustainabilityKeplerEndpoint = command.Flags().String("sustainability-kepler-endpoint", "http://localhost:8888/metrics", "Kepler metrics endpoint URL") + sustainabilityScrapeInterval = command.Flags().Duration("sustainability-scrape-interval", 30*time.Second, "Sustainability metrics scrape interval") dataBatchMaxSize = command.Flags().Uint32("data-batch-max-size", 524288, "Data batch max size in bytes (before compression)") dataBatchFlushInterval = command.Flags().Duration("data-batch-flush-interval", 15*time.Second, "Data batch flush interval. Data is flushed periodically if data batch size is not reached") @@ -216,6 +217,7 @@ func NewRunCommand(version string) *cobra.Command { Sustainability: config.SustainabilityConfig{ Enabled: *sustainabilityEnabled, KeplerEndpoint: *sustainabilityKeplerEndpoint, + ScrapeInterval: *sustainabilityScrapeInterval, }, KubeAPIServiceAddr: *kubeAPIServiceAddr, ExportersQueueSize: *exportersQueueSize, diff --git a/cmd/agent/daemon/pipeline/sustainability_pipeline.go b/cmd/agent/daemon/pipeline/sustainability_pipeline.go index c3614179..57833772 100644 --- a/cmd/agent/daemon/pipeline/sustainability_pipeline.go +++ b/cmd/agent/daemon/pipeline/sustainability_pipeline.go @@ -14,7 +14,7 @@ func (c *Controller) runSustainabilityPipeline(ctx context.Context) error { defer c.log.Info("sustainability pipeline done") scraper := sustainability.NewScraper(c.cfg.Sustainability.KeplerEndpoint) - ticker := time.NewTicker(30 * time.Second) + ticker := time.NewTicker(c.cfg.Sustainability.ScrapeInterval) defer ticker.Stop() for { From 2f08ac4fc65809613fd90a7a75b333a99e8973e3 Mon Sep 17 00:00:00 2001 From: tautvydasliekis Date: Fri, 29 Aug 2025 12:27:31 +0300 Subject: [PATCH 3/6] fix: Update default Kepler endpoint to use loopback address --- charts/kvisor/templates/agent.yaml | 112 ++++++++++++++--------------- charts/kvisor/values.yaml | 2 +- cmd/agent/daemon/daemon.go | 2 +- 3 files changed, 57 insertions(+), 59 deletions(-) diff --git a/charts/kvisor/templates/agent.yaml b/charts/kvisor/templates/agent.yaml index 00dd5a6c..6e47477d 100644 --- a/charts/kvisor/templates/agent.yaml +++ b/charts/kvisor/templates/agent.yaml @@ -160,58 +160,81 @@ spec: mountPath: /run/containerd/containerd.sock readOnly: true {{- if .Values.agent.sustainability.enabled }} - # Kepler sidecar container for energy monitoring + # Kepler (Kubernetes-based Efficient Power Level Exporter) sidecar container + # Documentation: https://sustainable-computing.io/ - name: kepler image: "quay.io/sustainable_computing_io/kepler:latest" imagePullPolicy: {{ .Values.image.pullPolicy }} securityContext: - privileged: false + # Kepler requires privileged mode for: + # - Intel RAPL (Running Average Power Limit) sensor access via /sys/class/powercap/intel-rapl + # - eBPF program loading and attachment to kernel tracepoints + # - Access to MSRs (Model Specific Registers) for CPU power monitoring + # - Hardware performance counters (perf events) + privileged: true readOnlyRootFilesystem: false - allowPrivilegeEscalation: false + allowPrivilegeEscalation: true capabilities: add: - - SYS_ADMIN + - SYS_ADMIN # Required for eBPF programs and tracepoint attachment + - SYS_RESOURCE # For resource limit modifications + - NET_ADMIN # For network-related eBPF programs + - PERFMON # For hardware performance counter access (Linux 5.8+) + - BPF # For eBPF operations (Linux 5.8+) drop: - ALL resources: requests: cpu: 100m - memory: 128Mi + memory: 200Mi command: - /usr/bin/kepler env: + # Node identification - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: KEPLER_LOG_LEVEL - value: "1" + value: "info" - name: KEPLER_ENABLE_FAKE_CPU_METER value: "true" + # Feature flags + - name: ENABLE_GPU + value: "false" # Set to true if NVIDIA GPUs are present + - name: ENABLE_EBPF_CGROUPID + value: "true" # Use eBPF for cgroup-based resource tracking + - name: EXPOSE_HW_COUNTER_METRICS + value: "true" # Expose hardware performance counter metrics + - name: ENABLE_PROCESS_METRICS + value: "false" # Process-level metrics (high overhead) + - name: METRICS_PATH + value: "/metrics" + - name: BIND_ADDRESS + value: "0.0.0.0:8888" ports: - containerPort: 8888 name: kepler-metrics protocol: TCP volumeMounts: + # Kernel modules for eBPF - name: lib-modules mountPath: /lib/modules readOnly: true - - name: usr-src - mountPath: /usr/src - readOnly: true - - name: boot - mountPath: /boot - readOnly: true - - name: proc - mountPath: /proc - readOnly: true + # System information and hardware sensors - name: sys mountPath: /sys + readOnly: false # Write access needed for eBPF maps and tracepoints + # Process and container information + - name: proc + mountPath: /proc readOnly: true - - name: kepler-config - mountPath: /etc/kepler/config.yaml - subPath: config.yaml + # Optional: Kernel headers for eBPF compilation + {{- if .Values.agent.sustainability.mountUsrSrc }} + - name: usr-src + mountPath: /usr/src readOnly: true + {{- end }} {{- end }} dnsPolicy: {{.Values.agent.dnsPolicy}} {{- with .Values.agent.nodeSelector }} @@ -248,21 +271,21 @@ spec: - name: lib-modules hostPath: path: /lib/modules - - name: usr-src - hostPath: - path: /usr/src - - name: boot + # Kernel modules for eBPF CO-RE + type: DirectoryOrCreate + - name: sys hostPath: - path: /boot + path: /sys + # Hardware sensors (/sys/class/powercap) and eBPF + type: Directory - name: proc hostPath: path: /proc - - name: sys + # Process information for container attribution + type: Directory + - name: usr-src hostPath: path: /sys - - name: kepler-config - configMap: - name: kepler-config {{- end }} {{- end }} --- @@ -356,37 +379,12 @@ metadata: {{- include "kvisor.agent.labels" . | nindent 4 }} app.kubernetes.io/component: kepler spec: + type: ClusterIP ports: - - name: kepler-metrics - port: 8888 - protocol: TCP - targetPort: kepler-metrics + - port: 8888 + targetPort: kepler-metrics + protocol: TCP + name: metrics selector: {{- include "kvisor.agent.selectorLabels" . | nindent 4 }} - type: ClusterIP ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: kepler-config - namespace: {{ .Release.Namespace }} -data: - config.yaml: | - cpu-estimator-address: "" - dram-estimator-address: "" - other-estimator-address: "" - uncore-estimator-address: "" - gpu-estimator-address: "" - enabledGPU: false - cpu: - msr: - enabled: false - acpi: - enabled: false - gpu: - nvml: - enabled: false - dcgm: - enabled: false - use-fake-cpu-power: false {{- end }} diff --git a/charts/kvisor/values.yaml b/charts/kvisor/values.yaml index 147c3288..b19f93dc 100644 --- a/charts/kvisor/values.yaml +++ b/charts/kvisor/values.yaml @@ -59,7 +59,7 @@ agent: name: "" # Specifies whether the service account token should be automounted. - automountServiceAccountToken: false + automountServiceAccountToken: true updateStrategy: type: RollingUpdate diff --git a/cmd/agent/daemon/daemon.go b/cmd/agent/daemon/daemon.go index 8b72107a..93dedc4a 100644 --- a/cmd/agent/daemon/daemon.go +++ b/cmd/agent/daemon/daemon.go @@ -89,7 +89,7 @@ func NewRunCommand(version string) *cobra.Command { processTreeEnabled = command.Flags().Bool("process-tree-enabled", false, "Enables process tree tracking") sustainabilityEnabled = command.Flags().Bool("sustainability-enabled", false, "Enables sustainability metrics collection") - sustainabilityKeplerEndpoint = command.Flags().String("sustainability-kepler-endpoint", "http://localhost:8888/metrics", "Kepler metrics endpoint URL") + sustainabilityKeplerEndpoint = command.Flags().String("sustainability-kepler-endpoint", "http://127.0.0.1:8888/metrics", "Kepler metrics endpoint URL") sustainabilityScrapeInterval = command.Flags().Duration("sustainability-scrape-interval", 30*time.Second, "Sustainability metrics scrape interval") dataBatchMaxSize = command.Flags().Uint32("data-batch-max-size", 524288, "Data batch max size in bytes (before compression)") From d82824c20ed45ba1f89b370cfae56c185c763798 Mon Sep 17 00:00:00 2001 From: tautvydasliekis Date: Fri, 29 Aug 2025 12:29:43 +0300 Subject: [PATCH 4/6] feat: Introduce sustainability-only mode for agent operations --- cmd/agent/daemon/app/app.go | 126 +++++++++++++++++++++ cmd/agent/daemon/sustainability/scraper.go | 2 +- cmd/agent/daemon/sustainability/types.go | 2 +- 3 files changed, 128 insertions(+), 2 deletions(-) diff --git a/cmd/agent/daemon/app/app.go b/cmd/agent/daemon/app/app.go index 3d74b85b..d949623b 100644 --- a/cmd/agent/daemon/app/app.go +++ b/cmd/agent/daemon/app/app.go @@ -11,6 +11,7 @@ import ( "net/http/pprof" "os" "runtime" + "sync" "time" "github.com/ClickHouse/clickhouse-go/v2" @@ -26,6 +27,7 @@ import ( "github.com/castai/kvisor/cmd/agent/daemon/metrics" "github.com/castai/kvisor/cmd/agent/daemon/netstats" "github.com/castai/kvisor/cmd/agent/daemon/pipeline" + "github.com/castai/kvisor/cmd/agent/daemon/sustainability" "github.com/castai/kvisor/pkg/castai" "github.com/castai/kvisor/pkg/cgroup" "github.com/castai/kvisor/pkg/containers" @@ -156,6 +158,12 @@ func (a *App) Run(ctx context.Context) error { return err } + //TODO: ONLY FOR TESTING + if cfg.Sustainability.Enabled { + log.Warnf("CRI runtime client failed, running in sustainability-only mode: %v", err) + return a.runSustainabilityOnlyMode(ctx, log, exporters) + } + criClient, criCloseFn, err := cri.NewRuntimeClient(ctx, cfg.CRIEndpoint) if err != nil { return fmt.Errorf("new CRI runtime client: %w", err) @@ -225,6 +233,10 @@ func (a *App) Run(ctx context.Context) error { PodName: podName, }) if err := tracer.Load(); err != nil { + if cfg.Sustainability.Enabled { + log.Warnf("eBPF tracer failed to load, running in sustainability-only mode: %v", err) + return a.runSustainabilityOnlyMode(ctx, log, exporters) + } return fmt.Errorf("loading tracer: %w", err) } defer tracer.Close() @@ -531,3 +543,117 @@ func waitWithTimeout(errg *errgroup.Group, timeout time.Duration) error { return err } } + +func (a *App) runSustainabilityOnlyMode(ctx context.Context, log *logging.Logger, exporters []export.DataBatchWriter) error { + log.Info("starting sustainability-only mode") + defer log.Info("stopping sustainability-only mode") + + // Create a minimal sustainability pipeline + sustainabilityPipeline := &sustainabilityOnlyPipeline{ + cfg: a.cfg, + log: log, + exporters: exporters, + } + + errg, ctx := errgroup.WithContext(ctx) + + errg.Go(func() error { + return a.runHTTPServer(ctx, log) + }) + + errg.Go(func() error { + return sustainabilityPipeline.run(ctx) + }) + + return errg.Wait() +} + +type sustainabilityOnlyPipeline struct { + cfg *config.Config + log *logging.Logger + exporters []export.DataBatchWriter +} + +func (p *sustainabilityOnlyPipeline) run(ctx context.Context) error { + return p.runSustainabilityPipeline(ctx) +} + +func (p *sustainabilityOnlyPipeline) runSustainabilityPipeline(ctx context.Context) error { + p.log.Info("running sustainability-only pipeline") + defer p.log.Info("sustainability-only pipeline done") + + scraper := sustainability.NewScraper(p.cfg.Sustainability.KeplerEndpoint) + interval := 30 * time.Second + if p.cfg.Sustainability.ScrapeInterval > 0 { + interval = p.cfg.Sustainability.ScrapeInterval + } + + ticker := time.NewTicker(interval) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-ticker.C: + start := time.Now() + stats, err := scraper.ScrapeMetrics() + if err != nil { + p.log.Warnf("failed to scrape sustainability metrics: %v", err) + continue + } + + if len(stats) == 0 { + p.log.Debug("no sustainability stats scraped") + continue + } + + // Print results to logs as requested + p.printSustainabilityResults(stats) + + items := make([]*castaipb.DataBatchItem, 0, len(stats)) + for _, stat := range stats { + items = append(items, &castaipb.DataBatchItem{ + Data: &castaipb.DataBatchItem_SustainabilityStats{ + SustainabilityStats: stat, + }, + }) + } + + p.sendDataBatch(items) + p.log.Infof("sustainability stats exported, count=%d, duration=%v", len(stats), time.Since(start)) + } + } +} + +func (p *sustainabilityOnlyPipeline) printSustainabilityResults(stats []*castaipb.SustainabilityStats) { + p.log.Info("=== SUSTAINABILITY RESULTS ===") + for _, stat := range stats { + p.log.Infof("Pod: %s/%s/%s | Energy: %.6f J | Carbon: %.6f gCO2e | Cost: $%.8f", + stat.Namespace, stat.PodName, stat.ContainerName, + stat.EnergyJoules, stat.CarbonGramsCo2E, stat.CostUsd) + } + p.log.Info("=== END SUSTAINABILITY RESULTS ===") +} + +func (p *sustainabilityOnlyPipeline) sendDataBatch(items []*castaipb.DataBatchItem) { + var g sync.WaitGroup + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + req := &castaipb.WriteDataBatchRequest{ + Items: items, + } + + for _, exp := range p.exporters { + g.Add(1) + go func(exporter export.DataBatchWriter) { + defer g.Done() + if err := exporter.Write(ctx, req); err != nil { + p.log.Warnf("failed to export sustainability data to %s: %v", exporter.Name(), err) + } + }(exp) + } + + g.Wait() +} diff --git a/cmd/agent/daemon/sustainability/scraper.go b/cmd/agent/daemon/sustainability/scraper.go index f7f04c82..b606fee6 100644 --- a/cmd/agent/daemon/sustainability/scraper.go +++ b/cmd/agent/daemon/sustainability/scraper.go @@ -71,7 +71,7 @@ func (s *Scraper) convertMetricToSustainabilityStats(metric *prom.Metric, timest labels[label.GetName()] = label.GetValue() } - namespace := labels["pod_namespace"] + namespace := labels["container_namespace"] podName := labels["pod_name"] containerName := labels["container_name"] nodeName := labels["instance"] diff --git a/cmd/agent/daemon/sustainability/types.go b/cmd/agent/daemon/sustainability/types.go index 8d1e37cb..e988a4f7 100644 --- a/cmd/agent/daemon/sustainability/types.go +++ b/cmd/agent/daemon/sustainability/types.go @@ -1,7 +1,7 @@ package sustainability const ( - KeplerContainerEnergyJoulesMetric = "kepler_container_energy_joules" + KeplerContainerEnergyJoulesMetric = "kepler_container_joules_total" ) // Sustainability calculation constants From 5aafb987074306e3438ba05a13a29367ec185311 Mon Sep 17 00:00:00 2001 From: tautvydasliekis Date: Fri, 29 Aug 2025 12:59:48 +0300 Subject: [PATCH 5/6] feat: Add node-level energy metrics support to sustainability pipeline --- cmd/agent/daemon/app/app.go | 8 ++--- cmd/agent/daemon/sustainability/scraper.go | 38 +++++++++++++++++----- cmd/agent/daemon/sustainability/types.go | 15 +++++++++ 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/cmd/agent/daemon/app/app.go b/cmd/agent/daemon/app/app.go index d949623b..6b57f243 100644 --- a/cmd/agent/daemon/app/app.go +++ b/cmd/agent/daemon/app/app.go @@ -233,10 +233,6 @@ func (a *App) Run(ctx context.Context) error { PodName: podName, }) if err := tracer.Load(); err != nil { - if cfg.Sustainability.Enabled { - log.Warnf("eBPF tracer failed to load, running in sustainability-only mode: %v", err) - return a.runSustainabilityOnlyMode(ctx, log, exporters) - } return fmt.Errorf("loading tracer: %w", err) } defer tracer.Close() @@ -629,8 +625,8 @@ func (p *sustainabilityOnlyPipeline) runSustainabilityPipeline(ctx context.Conte func (p *sustainabilityOnlyPipeline) printSustainabilityResults(stats []*castaipb.SustainabilityStats) { p.log.Info("=== SUSTAINABILITY RESULTS ===") for _, stat := range stats { - p.log.Infof("Pod: %s/%s/%s | Energy: %.6f J | Carbon: %.6f gCO2e | Cost: $%.8f", - stat.Namespace, stat.PodName, stat.ContainerName, + p.log.Infof("Instance: %s | Pod: %s/%s/%s | Energy: %.6f J | Carbon: %.6f gCO2e | Cost: $%.8f", + stat.NodeName, stat.Namespace, stat.PodName, stat.ContainerName, stat.EnergyJoules, stat.CarbonGramsCo2E, stat.CostUsd) } p.log.Info("=== END SUSTAINABILITY RESULTS ===") diff --git a/cmd/agent/daemon/sustainability/scraper.go b/cmd/agent/daemon/sustainability/scraper.go index b606fee6..3516f774 100644 --- a/cmd/agent/daemon/sustainability/scraper.go +++ b/cmd/agent/daemon/sustainability/scraper.go @@ -54,8 +54,9 @@ func (s *Scraper) parsePrometheusMetrics(r io.Reader) ([]*castaipb.Sustainabilit return stats, nil } + nodeNameFromMetrics := s.extractNodeNameFromMetrics(metricFamilies) for _, metric := range energyFamily.GetMetric() { - stat, err := s.convertMetricToSustainabilityStats(metric, timestamp) + stat, err := s.convertMetricToSustainabilityStats(metric, timestamp, nodeNameFromMetrics) if err != nil { continue } @@ -65,18 +66,39 @@ func (s *Scraper) parsePrometheusMetrics(r io.Reader) ([]*castaipb.Sustainabilit return stats, nil } -func (s *Scraper) convertMetricToSustainabilityStats(metric *prom.Metric, timestamp int64) (*castaipb.SustainabilityStats, error) { +func (s *Scraper) extractNodeNameFromMetrics(metricFamilies map[string]*prom.MetricFamily) string { + nodeMetrics := []string{ + KeplerNodeEnergyJoulesMetric, + KeplerNodeCoreEnergyJoulesMetric, + KeplerNodeDramEnergyJoulesMetric, + KeplerNodePackageEnergyJoulesMetric, + KeplerNodeUncoreEnergyJoulesMetric, + } + for _, metricName := range nodeMetrics { + if family, exists := metricFamilies[metricName]; exists { + for _, metric := range family.GetMetric() { + for _, label := range metric.GetLabel() { + if label.GetName() == InstanceLabel && label.GetValue() != "" { + return label.GetValue() + } + } + } + } + } + return "" +} + +func (s *Scraper) convertMetricToSustainabilityStats(metric *prom.Metric, timestamp int64, nodeName string) (*castaipb.SustainabilityStats, error) { labels := make(map[string]string) for _, label := range metric.GetLabel() { labels[label.GetName()] = label.GetValue() } - namespace := labels["container_namespace"] - podName := labels["pod_name"] - containerName := labels["container_name"] - nodeName := labels["instance"] + containerNamespace := labels[ContainerNamespaceLabel] + containerName := labels[ContainerNameLabel] + podName := labels[PodNameLabel] - if namespace == "" || podName == "" || containerName == "" { + if containerNamespace == "" || containerName == "" || podName == "" { return nil, fmt.Errorf("missing required labels") } @@ -93,7 +115,7 @@ func (s *Scraper) convertMetricToSustainabilityStats(metric *prom.Metric, timest costUsd := CalculateEnergyCost(value, DefaultEnergyPriceUSDPerKWh) return &castaipb.SustainabilityStats{ - Namespace: namespace, + Namespace: containerNamespace, PodName: podName, ContainerName: containerName, NodeName: nodeName, diff --git a/cmd/agent/daemon/sustainability/types.go b/cmd/agent/daemon/sustainability/types.go index e988a4f7..d04ed51a 100644 --- a/cmd/agent/daemon/sustainability/types.go +++ b/cmd/agent/daemon/sustainability/types.go @@ -1,7 +1,22 @@ package sustainability const ( + // Container metrics KeplerContainerEnergyJoulesMetric = "kepler_container_joules_total" + // Node metrics + KeplerNodeEnergyJoulesMetric = "kepler_node_joules_total" + KeplerNodeCoreEnergyJoulesMetric = "kepler_node_core_joules_total" + KeplerNodeDramEnergyJoulesMetric = "kepler_node_dram_joules_total" + KeplerNodePackageEnergyJoulesMetric = "kepler_node_package_joules_total" + KeplerNodeUncoreEnergyJoulesMetric = "kepler_node_uncore_joules_total" +) + +const ( + // Metrics label keys + ContainerNamespaceLabel = "container_namespace" + ContainerNameLabel = "container_name" + PodNameLabel = "pod_name" + InstanceLabel = "instance" // node name label in Kepler metrics ) // Sustainability calculation constants From d99ee6ab0c377d10212102c18e34b27582a9d9d9 Mon Sep 17 00:00:00 2001 From: tautvydasliekis Date: Fri, 29 Aug 2025 13:24:22 +0300 Subject: [PATCH 6/6] feat: Add model server and testing options to kvisor configuration --- charts/kvisor/templates/agent.yaml | 72 +++++++++++++++++++++++++----- charts/kvisor/values.yaml | 8 ++++ 2 files changed, 70 insertions(+), 10 deletions(-) diff --git a/charts/kvisor/templates/agent.yaml b/charts/kvisor/templates/agent.yaml index 6e47477d..d81574b6 100644 --- a/charts/kvisor/templates/agent.yaml +++ b/charts/kvisor/templates/agent.yaml @@ -50,6 +50,11 @@ spec: serviceAccountName: {{ include "kvisor.agent.serviceAccountName" . }} automountServiceAccountToken: {{ .Values.agent.automountServiceAccountToken }} hostPID: true + {{- if .Values.agent.sustainability.enabled }} + # hostNetwork required for Kepler to access hardware sensors (RAPL, MSRs) + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + {{- end }} securityContext: {{- toYaml .Values.agent.securityContext | nindent 8 }} priorityClassName: {{ .Values.agent.priorityClass }} @@ -195,27 +200,74 @@ spec: valueFrom: fieldRef: fieldPath: spec.nodeName + # Official Kepler environment variables based on sustainable-computing.io docs - name: KEPLER_LOG_LEVEL - value: "info" - - name: KEPLER_ENABLE_FAKE_CPU_METER - value: "true" - # Feature flags - - name: ENABLE_GPU - value: "false" # Set to true if NVIDIA GPUs are present + value: "1" # Numeric levels: 0=debug, 1=info, 2=warn, 3=error + - name: METRIC_PATH + value: "/metrics" # Prometheus metrics endpoint path + - name: BIND_ADDRESS + value: "0.0.0.0:8888" # Metrics server bind address + + # Metrics collection configuration + - name: COUNTER_METRICS + value: "*" # Enable all counter metrics + - name: BPF_METRICS + value: "*" # Enable all eBPF metrics + - name: PERF_METRICS + value: "*" # Enable all performance counter metrics + - name: GPU_METRICS + value: "" # Empty = disabled, "*" = all GPU metrics + + # Feature flags (official Kepler configuration) - name: ENABLE_EBPF_CGROUPID value: "true" # Use eBPF for cgroup-based resource tracking - name: EXPOSE_HW_COUNTER_METRICS value: "true" # Expose hardware performance counter metrics - name: ENABLE_PROCESS_METRICS value: "false" # Process-level metrics (high overhead) - - name: METRICS_PATH - value: "/metrics" - - name: BIND_ADDRESS - value: "0.0.0.0:8888" + + # Model server configuration (for environments without hardware sensors) + - name: MODEL_SERVER_ENABLE + value: "{{ .Values.agent.sustainability.modelServer.enabled | default "false" }}" # External ML model for power estimation + {{- if .Values.agent.sustainability.modelServer.enabled }} + - name: MODEL_SERVER_ENDPOINT + value: "{{ .Values.agent.sustainability.modelServer.endpoint }}" + {{- end }} + + # Development/testing configuration + {{- if .Values.agent.sustainability.fakeCpuMeter }} + - name: KEPLER_ENABLE_FAKE_CPU_METER + value: "true" # Enable fake CPU meter for testing without RAPL + {{- end }} ports: - containerPort: 8888 name: kepler-metrics protocol: TCP + # Health checks based on official Kepler Helm chart + livenessProbe: + httpGet: + path: /healthz + port: kepler-metrics + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /healthz + port: kepler-metrics + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + startupProbe: + httpGet: + path: /healthz + port: kepler-metrics + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 12 volumeMounts: # Kernel modules for eBPF - name: lib-modules diff --git a/charts/kvisor/values.yaml b/charts/kvisor/values.yaml index b19f93dc..f78cd42c 100644 --- a/charts/kvisor/values.yaml +++ b/charts/kvisor/values.yaml @@ -132,6 +132,14 @@ agent: enabled: true keplerEndpoint: "http://localhost:8888/metrics" scrapeInterval: "30s" + # Model server for environments without hardware sensors (cloud/virtualized) + modelServer: + enabled: false + endpoint: "http://kepler-model-server:8100" + # Enable fake CPU meter for testing without RAPL sensors + fakeCpuMeter: false + # Mount /usr/src for eBPF compilation (optional) + mountUsrSrc: false # Extra args for egressd collector container. extraArgs: