From d79ccd49b8540ac78664ab19556a7ca3d1326096 Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Tue, 25 Jun 2024 13:40:47 +0200 Subject: [PATCH 1/4] Add global processor config to Component message --- elastic-agent-client.proto | 15 + pkg/proto/elastic-agent-client.pb.go | 761 +++++++++++++++++---------- 2 files changed, 491 insertions(+), 285 deletions(-) diff --git a/elastic-agent-client.proto b/elastic-agent-client.proto index f9921a7..ded22f2 100644 --- a/elastic-agent-client.proto +++ b/elastic-agent-client.proto @@ -259,6 +259,7 @@ message APMConfig { message Component { ComponentLimits limits = 1; optional APMConfig apm_config = 2; + optional GlobalProcessorsConfig processors = 3; } // Limits to configure for the currently running component. @@ -274,6 +275,20 @@ message ComponentLimits { uint64 go_max_procs = 2; } +// A processor config. Enabled flag is a separate field to check easily activation/deactivation. All the rest of the config +// is in the generic Struct config field +message ProcessorConfig { + google.protobuf.Struct source = 1; + bool enabled = 2; + google.protobuf.Struct config = 3; +} + +// Configure some global processors for event data at component level +message GlobalProcessorsConfig { + google.protobuf.Struct source = 1; + map configs = 2; +} + // A set of units and their expected states and configuration. message CheckinExpected { // Units is the expected units the component should be running. Note that units can be added or diff --git a/pkg/proto/elastic-agent-client.pb.go b/pkg/proto/elastic-agent-client.pb.go index 62ec18d..6e0db78 100644 --- a/pkg/proto/elastic-agent-client.pb.go +++ b/pkg/proto/elastic-agent-client.pb.go @@ -405,7 +405,7 @@ func (x ActionRequest_Type) Number() protoreflect.EnumNumber { // Deprecated: Use ActionRequest_Type.Descriptor instead. func (ActionRequest_Type) EnumDescriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{18, 0} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{20, 0} } // The level that the action is operating on. @@ -459,7 +459,7 @@ func (x ActionRequest_Level) Number() protoreflect.EnumNumber { // Deprecated: Use ActionRequest_Level.Descriptor instead. func (ActionRequest_Level) EnumDescriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{18, 1} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{20, 1} } // Status result of the action. @@ -508,7 +508,7 @@ func (x ActionResponse_Status) Number() protoreflect.EnumNumber { // Deprecated: Use ActionResponse_Status.Descriptor instead. func (ActionResponse_Status) EnumDescriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{20, 0} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{22, 0} } // Package metadata provided in the meta field of a unit. @@ -1398,8 +1398,9 @@ type Component struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Limits *ComponentLimits `protobuf:"bytes,1,opt,name=limits,proto3" json:"limits,omitempty"` - ApmConfig *APMConfig `protobuf:"bytes,2,opt,name=apm_config,json=apmConfig,proto3,oneof" json:"apm_config,omitempty"` + Limits *ComponentLimits `protobuf:"bytes,1,opt,name=limits,proto3" json:"limits,omitempty"` + ApmConfig *APMConfig `protobuf:"bytes,2,opt,name=apm_config,json=apmConfig,proto3,oneof" json:"apm_config,omitempty"` + Processors *GlobalProcessorsConfig `protobuf:"bytes,3,opt,name=processors,proto3,oneof" json:"processors,omitempty"` } func (x *Component) Reset() { @@ -1448,6 +1449,13 @@ func (x *Component) GetApmConfig() *APMConfig { return nil } +func (x *Component) GetProcessors() *GlobalProcessorsConfig { + if x != nil { + return x.Processors + } + return nil +} + // Limits to configure for the currently running component. type ComponentLimits struct { state protoimpl.MessageState @@ -1510,6 +1518,127 @@ func (x *ComponentLimits) GetGoMaxProcs() uint64 { return 0 } +// A processor config. Enabled flag is a separate field to check easily activation/deactivation. All the rest of the config +// is in the generic Struct config field +type ProcessorConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Source *structpb.Struct `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` + Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` + Config *structpb.Struct `protobuf:"bytes,3,opt,name=config,proto3" json:"config,omitempty"` +} + +func (x *ProcessorConfig) Reset() { + *x = ProcessorConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_elastic_agent_client_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProcessorConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProcessorConfig) ProtoMessage() {} + +func (x *ProcessorConfig) ProtoReflect() protoreflect.Message { + mi := &file_elastic_agent_client_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProcessorConfig.ProtoReflect.Descriptor instead. +func (*ProcessorConfig) Descriptor() ([]byte, []int) { + return file_elastic_agent_client_proto_rawDescGZIP(), []int{14} +} + +func (x *ProcessorConfig) GetSource() *structpb.Struct { + if x != nil { + return x.Source + } + return nil +} + +func (x *ProcessorConfig) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *ProcessorConfig) GetConfig() *structpb.Struct { + if x != nil { + return x.Config + } + return nil +} + +// Configure some global processors for event data at component level +type GlobalProcessorsConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Source *structpb.Struct `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` + Configs map[string]*ProcessorConfig `protobuf:"bytes,2,rep,name=configs,proto3" json:"configs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GlobalProcessorsConfig) Reset() { + *x = GlobalProcessorsConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_elastic_agent_client_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GlobalProcessorsConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GlobalProcessorsConfig) ProtoMessage() {} + +func (x *GlobalProcessorsConfig) ProtoReflect() protoreflect.Message { + mi := &file_elastic_agent_client_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GlobalProcessorsConfig.ProtoReflect.Descriptor instead. +func (*GlobalProcessorsConfig) Descriptor() ([]byte, []int) { + return file_elastic_agent_client_proto_rawDescGZIP(), []int{15} +} + +func (x *GlobalProcessorsConfig) GetSource() *structpb.Struct { + if x != nil { + return x.Source + } + return nil +} + +func (x *GlobalProcessorsConfig) GetConfigs() map[string]*ProcessorConfig { + if x != nil { + return x.Configs + } + return nil +} + // A set of units and their expected states and configuration. type CheckinExpected struct { state protoimpl.MessageState @@ -1549,7 +1678,7 @@ type CheckinExpected struct { func (x *CheckinExpected) Reset() { *x = CheckinExpected{} if protoimpl.UnsafeEnabled { - mi := &file_elastic_agent_client_proto_msgTypes[14] + mi := &file_elastic_agent_client_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1562,7 +1691,7 @@ func (x *CheckinExpected) String() string { func (*CheckinExpected) ProtoMessage() {} func (x *CheckinExpected) ProtoReflect() protoreflect.Message { - mi := &file_elastic_agent_client_proto_msgTypes[14] + mi := &file_elastic_agent_client_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1575,7 +1704,7 @@ func (x *CheckinExpected) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckinExpected.ProtoReflect.Descriptor instead. func (*CheckinExpected) Descriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{14} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{16} } func (x *CheckinExpected) GetUnits() []*UnitExpected { @@ -1656,7 +1785,7 @@ type UnitObserved struct { func (x *UnitObserved) Reset() { *x = UnitObserved{} if protoimpl.UnsafeEnabled { - mi := &file_elastic_agent_client_proto_msgTypes[15] + mi := &file_elastic_agent_client_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1669,7 +1798,7 @@ func (x *UnitObserved) String() string { func (*UnitObserved) ProtoMessage() {} func (x *UnitObserved) ProtoReflect() protoreflect.Message { - mi := &file_elastic_agent_client_proto_msgTypes[15] + mi := &file_elastic_agent_client_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1682,7 +1811,7 @@ func (x *UnitObserved) ProtoReflect() protoreflect.Message { // Deprecated: Use UnitObserved.ProtoReflect.Descriptor instead. func (*UnitObserved) Descriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{15} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{17} } func (x *UnitObserved) GetId() string { @@ -1744,7 +1873,7 @@ type CheckinObservedVersionInfo struct { func (x *CheckinObservedVersionInfo) Reset() { *x = CheckinObservedVersionInfo{} if protoimpl.UnsafeEnabled { - mi := &file_elastic_agent_client_proto_msgTypes[16] + mi := &file_elastic_agent_client_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1757,7 +1886,7 @@ func (x *CheckinObservedVersionInfo) String() string { func (*CheckinObservedVersionInfo) ProtoMessage() {} func (x *CheckinObservedVersionInfo) ProtoReflect() protoreflect.Message { - mi := &file_elastic_agent_client_proto_msgTypes[16] + mi := &file_elastic_agent_client_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1770,7 +1899,7 @@ func (x *CheckinObservedVersionInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckinObservedVersionInfo.ProtoReflect.Descriptor instead. func (*CheckinObservedVersionInfo) Descriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{16} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{18} } func (x *CheckinObservedVersionInfo) GetName() string { @@ -1831,7 +1960,7 @@ type CheckinObserved struct { func (x *CheckinObserved) Reset() { *x = CheckinObserved{} if protoimpl.UnsafeEnabled { - mi := &file_elastic_agent_client_proto_msgTypes[17] + mi := &file_elastic_agent_client_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1844,7 +1973,7 @@ func (x *CheckinObserved) String() string { func (*CheckinObserved) ProtoMessage() {} func (x *CheckinObserved) ProtoReflect() protoreflect.Message { - mi := &file_elastic_agent_client_proto_msgTypes[17] + mi := &file_elastic_agent_client_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1857,7 +1986,7 @@ func (x *CheckinObserved) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckinObserved.ProtoReflect.Descriptor instead. func (*CheckinObserved) Descriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{17} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{19} } func (x *CheckinObserved) GetToken() string { @@ -1943,7 +2072,7 @@ type ActionRequest struct { func (x *ActionRequest) Reset() { *x = ActionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_elastic_agent_client_proto_msgTypes[18] + mi := &file_elastic_agent_client_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1956,7 +2085,7 @@ func (x *ActionRequest) String() string { func (*ActionRequest) ProtoMessage() {} func (x *ActionRequest) ProtoReflect() protoreflect.Message { - mi := &file_elastic_agent_client_proto_msgTypes[18] + mi := &file_elastic_agent_client_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1969,7 +2098,7 @@ func (x *ActionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionRequest.ProtoReflect.Descriptor instead. func (*ActionRequest) Descriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{18} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{20} } func (x *ActionRequest) GetId() string { @@ -2043,7 +2172,7 @@ type ActionDiagnosticUnitResult struct { func (x *ActionDiagnosticUnitResult) Reset() { *x = ActionDiagnosticUnitResult{} if protoimpl.UnsafeEnabled { - mi := &file_elastic_agent_client_proto_msgTypes[19] + mi := &file_elastic_agent_client_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2056,7 +2185,7 @@ func (x *ActionDiagnosticUnitResult) String() string { func (*ActionDiagnosticUnitResult) ProtoMessage() {} func (x *ActionDiagnosticUnitResult) ProtoReflect() protoreflect.Message { - mi := &file_elastic_agent_client_proto_msgTypes[19] + mi := &file_elastic_agent_client_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2069,7 +2198,7 @@ func (x *ActionDiagnosticUnitResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionDiagnosticUnitResult.ProtoReflect.Descriptor instead. func (*ActionDiagnosticUnitResult) Descriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{19} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{21} } func (x *ActionDiagnosticUnitResult) GetName() string { @@ -2137,7 +2266,7 @@ type ActionResponse struct { func (x *ActionResponse) Reset() { *x = ActionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_elastic_agent_client_proto_msgTypes[20] + mi := &file_elastic_agent_client_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2150,7 +2279,7 @@ func (x *ActionResponse) String() string { func (*ActionResponse) ProtoMessage() {} func (x *ActionResponse) ProtoReflect() protoreflect.Message { - mi := &file_elastic_agent_client_proto_msgTypes[20] + mi := &file_elastic_agent_client_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2163,7 +2292,7 @@ func (x *ActionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionResponse.ProtoReflect.Descriptor instead. func (*ActionResponse) Descriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{20} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{22} } func (x *ActionResponse) GetToken() string { @@ -2238,7 +2367,7 @@ type StartUpInfo struct { func (x *StartUpInfo) Reset() { *x = StartUpInfo{} if protoimpl.UnsafeEnabled { - mi := &file_elastic_agent_client_proto_msgTypes[21] + mi := &file_elastic_agent_client_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2251,7 +2380,7 @@ func (x *StartUpInfo) String() string { func (*StartUpInfo) ProtoMessage() {} func (x *StartUpInfo) ProtoReflect() protoreflect.Message { - mi := &file_elastic_agent_client_proto_msgTypes[21] + mi := &file_elastic_agent_client_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2264,7 +2393,7 @@ func (x *StartUpInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use StartUpInfo.ProtoReflect.Descriptor instead. func (*StartUpInfo) Descriptor() ([]byte, []int) { - return file_elastic_agent_client_proto_rawDescGZIP(), []int{21} + return file_elastic_agent_client_proto_rawDescGZIP(), []int{23} } func (x *StartUpInfo) GetAddr() string { @@ -2454,206 +2583,235 @@ var file_elastic_agent_client_proto_rawDesc = []byte{ 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x41, 0x50, 0x4d, 0x52, 0x07, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, - 0x63, 0x22, 0x80, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, + 0x63, 0x22, 0xd3, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x61, 0x70, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x50, 0x4d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x09, 0x61, 0x70, 0x6d, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x6d, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x22, 0x64, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x67, 0x6f, 0x5f, 0x6d, - 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x67, 0x6f, 0x4d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x63, 0x73, 0x22, 0xd7, 0x02, 0x0a, 0x0f, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x29, - 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x6e, 0x69, 0x74, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x52, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x0a, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x08, 0x66, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x08, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x5f, 0x69, 0x64, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x49, 0x64, 0x78, 0x12, 0x2e, 0x0a, 0x09, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, - 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x78, 0x12, - 0x43, 0x0a, 0x0f, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 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, 0x0e, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0xde, 0x01, 0x0a, 0x0c, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x6e, 0x69, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x78, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x49, 0x64, 0x78, 0x12, 0x22, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xc9, 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, - 0x6e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x48, 0x61, 0x73, 0x68, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, - 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, 0x94, 0x03, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x75, - 0x6e, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, - 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x48, - 0x00, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, - 0x01, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x64, - 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x49, 0x64, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x78, 0x12, 0x43, 0x0a, 0x0f, 0x75, 0x6e, 0x69, - 0x74, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 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, 0x0e, - 0x75, 0x6e, 0x69, 0x74, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x35, - 0x0a, 0x08, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x08, 0x73, 0x75, 0x70, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x03, 0x70, 0x69, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, 0x08, - 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xc3, 0x02, 0x0a, 0x0d, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 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, 0x16, - 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x12, - 0x2c, 0x0a, 0x09, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x6e, 0x69, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x08, 0x75, 0x6e, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2d, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x05, - 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x23, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, - 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x49, 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x54, 0x49, 0x43, - 0x53, 0x10, 0x01, 0x22, 0x29, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x07, 0x0a, 0x03, - 0x41, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45, - 0x4e, 0x54, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x4e, 0x49, 0x54, 0x10, 0x02, 0x22, 0xe5, - 0x01, 0x0a, 0x1a, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, + 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, + 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x22, 0x64, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x67, + 0x6f, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0a, 0x67, 0x6f, 0x4d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x63, 0x73, 0x22, 0x8d, 0x01, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x06, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xe3, 0x01, + 0x0a, 0x16, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, + 0x52, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xd7, 0x02, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x45, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, + 0x6e, 0x69, 0x74, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x05, 0x75, 0x6e, 0x69, + 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x64, 0x78, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x49, 0x64, 0x78, 0x12, 0x2e, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x78, 0x12, 0x43, 0x0a, 0x0f, 0x75, 0x6e, 0x69, 0x74, + 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 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, 0x0e, 0x75, + 0x6e, 0x69, 0x74, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xde, 0x01, + 0x0a, 0x0c, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x64, 0x78, 0x12, 0x22, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xc9, + 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 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, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x22, 0xea, 0x01, 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x41, 0x0a, - 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x22, 0x21, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, - 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x01, 0x22, 0xf0, 0x02, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x17, - 0x0a, 0x07, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x06, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, - 0x63, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, - 0x43, 0x65, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x65, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, - 0x33, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, - 0x73, 0x52, 0x08, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6d, - 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2f, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2a, 0x29, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x13, 0x0a, 0x0f, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x10, - 0x00, 0x2a, 0x68, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, - 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4e, 0x46, - 0x49, 0x47, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x45, 0x41, - 0x4c, 0x54, 0x48, 0x59, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x47, 0x52, 0x41, 0x44, - 0x45, 0x44, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, - 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0b, - 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x06, 0x2a, 0x21, 0x0a, 0x08, 0x55, - 0x6e, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x50, 0x55, 0x54, - 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x10, 0x01, 0x2a, 0x43, - 0x0a, 0x0c, 0x55, 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, - 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, - 0x4e, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x02, 0x12, 0x09, 0x0a, - 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, - 0x45, 0x10, 0x04, 0x2a, 0x2f, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x41, 0x4e, 0x41, 0x47, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x41, 0x4c, 0x4f, - 0x4e, 0x45, 0x10, 0x01, 0x2a, 0x50, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x69, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, - 0x56, 0x32, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x10, 0x02, 0x12, - 0x0c, 0x0a, 0x08, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, - 0x03, 0x4c, 0x6f, 0x67, 0x10, 0x04, 0x32, 0xc6, 0x01, 0x0a, 0x0c, 0x45, 0x6c, 0x61, 0x73, 0x74, - 0x69, 0x63, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x09, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x56, 0x32, 0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x69, 0x6e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x1a, 0x16, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x28, 0x01, 0x30, 0x01, 0x12, 0x3a, 0x0a, 0x07, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x28, 0x01, 0x30, 0x01, 0x12, 0x39, 0x0a, 0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, - 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x28, 0x01, 0x30, 0x01, 0x42, - 0x14, 0x5a, 0x0f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x12, 0x3f, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6d, 0x65, + 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x48, 0x61, 0x73, + 0x68, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 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, 0x94, 0x03, 0x0a, 0x0f, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x6e, 0x69, 0x74, + 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x12, + 0x49, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x64, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0b, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x49, 0x64, 0x78, 0x12, 0x23, 0x0a, + 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x78, 0x12, 0x43, 0x0a, 0x0f, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 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, 0x0e, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x52, 0x08, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x70, 0x69, 0x64, + 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x22, 0xc3, 0x02, 0x0a, 0x0d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 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, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x17, 0x0a, 0x07, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x75, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x09, 0x75, 0x6e, 0x69, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x75, 0x6e, + 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x23, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, + 0x49, 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x54, 0x49, 0x43, 0x53, 0x10, 0x01, 0x22, 0x29, 0x0a, 0x05, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x55, 0x4e, 0x49, 0x54, 0x10, 0x02, 0x22, 0xe5, 0x01, 0x0a, 0x1a, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x55, 0x6e, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x06, 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, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x22, + 0xea, 0x01, 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x41, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x64, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x22, 0x21, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x22, 0xf0, 0x02, 0x0a, + 0x0b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x61, 0x5f, 0x63, 0x65, + 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x70, 0x65, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x35, 0x0a, + 0x08, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x08, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, + 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2f, + 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2a, + 0x29, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x2a, 0x68, 0x0a, 0x05, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, + 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x49, 0x4e, 0x47, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x02, 0x12, + 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x47, 0x52, 0x41, 0x44, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0a, 0x0a, + 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x4f, + 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, + 0x45, 0x44, 0x10, 0x06, 0x2a, 0x21, 0x0a, 0x08, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, + 0x55, 0x54, 0x50, 0x55, 0x54, 0x10, 0x01, 0x2a, 0x43, 0x0a, 0x0c, 0x55, 0x6e, 0x69, 0x74, 0x4c, + 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, + 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, + 0x03, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x04, 0x2a, 0x2f, 0x0a, 0x10, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, + 0x0a, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x41, 0x4c, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x2a, 0x50, 0x0a, + 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x56, 0x32, 0x10, 0x01, 0x12, 0x09, 0x0a, + 0x05, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x10, 0x04, 0x32, + 0xc6, 0x01, 0x0a, 0x0c, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x3f, 0x0a, 0x09, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x56, 0x32, 0x12, 0x16, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x4f, 0x62, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x28, 0x01, 0x30, + 0x01, 0x12, 0x3a, 0x0a, 0x07, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x15, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x01, 0x30, 0x01, 0x12, 0x39, 0x0a, + 0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x1a, 0x14, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x28, 0x01, 0x30, 0x01, 0x42, 0x14, 0x5a, 0x0f, 0x70, 0x6b, 0x67, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xf8, 0x01, 0x01, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2669,7 +2827,7 @@ func file_elastic_agent_client_proto_rawDescGZIP() []byte { } var file_elastic_agent_client_proto_enumTypes = make([]protoimpl.EnumInfo, 9) -var file_elastic_agent_client_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_elastic_agent_client_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_elastic_agent_client_proto_goTypes = []interface{}{ (ConnectionSupports)(0), // 0: proto.ConnectionSupports (State)(0), // 1: proto.State @@ -2694,28 +2852,31 @@ var file_elastic_agent_client_proto_goTypes = []interface{}{ (*APMConfig)(nil), // 20: proto.APMConfig (*Component)(nil), // 21: proto.Component (*ComponentLimits)(nil), // 22: proto.ComponentLimits - (*CheckinExpected)(nil), // 23: proto.CheckinExpected - (*UnitObserved)(nil), // 24: proto.UnitObserved - (*CheckinObservedVersionInfo)(nil), // 25: proto.CheckinObservedVersionInfo - (*CheckinObserved)(nil), // 26: proto.CheckinObserved - (*ActionRequest)(nil), // 27: proto.ActionRequest - (*ActionDiagnosticUnitResult)(nil), // 28: proto.ActionDiagnosticUnitResult - (*ActionResponse)(nil), // 29: proto.ActionResponse - (*StartUpInfo)(nil), // 30: proto.StartUpInfo - nil, // 31: proto.CheckinObservedVersionInfo.MetaEntry - (*structpb.Struct)(nil), // 32: google.protobuf.Struct - (*timestamppb.Timestamp)(nil), // 33: google.protobuf.Timestamp - (*StateObserved)(nil), // 34: proto.StateObserved - (*StateExpected)(nil), // 35: proto.StateExpected + (*ProcessorConfig)(nil), // 23: proto.ProcessorConfig + (*GlobalProcessorsConfig)(nil), // 24: proto.GlobalProcessorsConfig + (*CheckinExpected)(nil), // 25: proto.CheckinExpected + (*UnitObserved)(nil), // 26: proto.UnitObserved + (*CheckinObservedVersionInfo)(nil), // 27: proto.CheckinObservedVersionInfo + (*CheckinObserved)(nil), // 28: proto.CheckinObserved + (*ActionRequest)(nil), // 29: proto.ActionRequest + (*ActionDiagnosticUnitResult)(nil), // 30: proto.ActionDiagnosticUnitResult + (*ActionResponse)(nil), // 31: proto.ActionResponse + (*StartUpInfo)(nil), // 32: proto.StartUpInfo + nil, // 33: proto.GlobalProcessorsConfig.ConfigsEntry + nil, // 34: proto.CheckinObservedVersionInfo.MetaEntry + (*structpb.Struct)(nil), // 35: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 36: google.protobuf.Timestamp + (*StateObserved)(nil), // 37: proto.StateObserved + (*StateExpected)(nil), // 38: proto.StateExpected } var file_elastic_agent_client_proto_depIdxs = []int32{ - 32, // 0: proto.Package.source:type_name -> google.protobuf.Struct - 32, // 1: proto.Meta.source:type_name -> google.protobuf.Struct + 35, // 0: proto.Package.source:type_name -> google.protobuf.Struct + 35, // 1: proto.Meta.source:type_name -> google.protobuf.Struct 9, // 2: proto.Meta.package:type_name -> proto.Package - 32, // 3: proto.DataStream.source:type_name -> google.protobuf.Struct - 32, // 4: proto.Stream.source:type_name -> google.protobuf.Struct + 35, // 3: proto.DataStream.source:type_name -> google.protobuf.Struct + 35, // 4: proto.Stream.source:type_name -> google.protobuf.Struct 11, // 5: proto.Stream.data_stream:type_name -> proto.DataStream - 32, // 6: proto.UnitExpectedConfig.source:type_name -> google.protobuf.Struct + 35, // 6: proto.UnitExpectedConfig.source:type_name -> google.protobuf.Struct 10, // 7: proto.UnitExpectedConfig.meta:type_name -> proto.Meta 11, // 8: proto.UnitExpectedConfig.data_stream:type_name -> proto.DataStream 12, // 9: proto.UnitExpectedConfig.streams:type_name -> proto.Stream @@ -2724,46 +2885,52 @@ var file_elastic_agent_client_proto_depIdxs = []int32{ 13, // 12: proto.UnitExpected.config:type_name -> proto.UnitExpectedConfig 3, // 13: proto.UnitExpected.log_level:type_name -> proto.UnitLogLevel 4, // 14: proto.AgentInfo.mode:type_name -> proto.AgentManagedMode - 32, // 15: proto.Features.source:type_name -> google.protobuf.Struct + 35, // 15: proto.Features.source:type_name -> google.protobuf.Struct 17, // 16: proto.Features.fqdn:type_name -> proto.FQDNFeature 18, // 17: proto.ElasticAPM.tls:type_name -> proto.ElasticAPMTLS 19, // 18: proto.APMConfig.elastic:type_name -> proto.ElasticAPM 22, // 19: proto.Component.limits:type_name -> proto.ComponentLimits 20, // 20: proto.Component.apm_config:type_name -> proto.APMConfig - 32, // 21: proto.ComponentLimits.source:type_name -> google.protobuf.Struct - 14, // 22: proto.CheckinExpected.units:type_name -> proto.UnitExpected - 15, // 23: proto.CheckinExpected.agent_info:type_name -> proto.AgentInfo - 16, // 24: proto.CheckinExpected.features:type_name -> proto.Features - 21, // 25: proto.CheckinExpected.component:type_name -> proto.Component - 33, // 26: proto.CheckinExpected.units_timestamp:type_name -> google.protobuf.Timestamp - 2, // 27: proto.UnitObserved.type:type_name -> proto.UnitType - 1, // 28: proto.UnitObserved.state:type_name -> proto.State - 32, // 29: proto.UnitObserved.payload:type_name -> google.protobuf.Struct - 31, // 30: proto.CheckinObservedVersionInfo.meta:type_name -> proto.CheckinObservedVersionInfo.MetaEntry - 24, // 31: proto.CheckinObserved.units:type_name -> proto.UnitObserved - 25, // 32: proto.CheckinObserved.version_info:type_name -> proto.CheckinObservedVersionInfo - 33, // 33: proto.CheckinObserved.units_timestamp:type_name -> google.protobuf.Timestamp - 0, // 34: proto.CheckinObserved.supports:type_name -> proto.ConnectionSupports - 2, // 35: proto.ActionRequest.unit_type:type_name -> proto.UnitType - 6, // 36: proto.ActionRequest.type:type_name -> proto.ActionRequest.Type - 7, // 37: proto.ActionRequest.level:type_name -> proto.ActionRequest.Level - 33, // 38: proto.ActionDiagnosticUnitResult.generated:type_name -> google.protobuf.Timestamp - 8, // 39: proto.ActionResponse.status:type_name -> proto.ActionResponse.Status - 28, // 40: proto.ActionResponse.diagnostic:type_name -> proto.ActionDiagnosticUnitResult - 5, // 41: proto.StartUpInfo.services:type_name -> proto.ConnInfoServices - 0, // 42: proto.StartUpInfo.supports:type_name -> proto.ConnectionSupports - 15, // 43: proto.StartUpInfo.agent_info:type_name -> proto.AgentInfo - 26, // 44: proto.ElasticAgent.CheckinV2:input_type -> proto.CheckinObserved - 29, // 45: proto.ElasticAgent.Actions:input_type -> proto.ActionResponse - 34, // 46: proto.ElasticAgent.Checkin:input_type -> proto.StateObserved - 23, // 47: proto.ElasticAgent.CheckinV2:output_type -> proto.CheckinExpected - 27, // 48: proto.ElasticAgent.Actions:output_type -> proto.ActionRequest - 35, // 49: proto.ElasticAgent.Checkin:output_type -> proto.StateExpected - 47, // [47:50] is the sub-list for method output_type - 44, // [44:47] 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 + 24, // 21: proto.Component.processors:type_name -> proto.GlobalProcessorsConfig + 35, // 22: proto.ComponentLimits.source:type_name -> google.protobuf.Struct + 35, // 23: proto.ProcessorConfig.source:type_name -> google.protobuf.Struct + 35, // 24: proto.ProcessorConfig.config:type_name -> google.protobuf.Struct + 35, // 25: proto.GlobalProcessorsConfig.source:type_name -> google.protobuf.Struct + 33, // 26: proto.GlobalProcessorsConfig.configs:type_name -> proto.GlobalProcessorsConfig.ConfigsEntry + 14, // 27: proto.CheckinExpected.units:type_name -> proto.UnitExpected + 15, // 28: proto.CheckinExpected.agent_info:type_name -> proto.AgentInfo + 16, // 29: proto.CheckinExpected.features:type_name -> proto.Features + 21, // 30: proto.CheckinExpected.component:type_name -> proto.Component + 36, // 31: proto.CheckinExpected.units_timestamp:type_name -> google.protobuf.Timestamp + 2, // 32: proto.UnitObserved.type:type_name -> proto.UnitType + 1, // 33: proto.UnitObserved.state:type_name -> proto.State + 35, // 34: proto.UnitObserved.payload:type_name -> google.protobuf.Struct + 34, // 35: proto.CheckinObservedVersionInfo.meta:type_name -> proto.CheckinObservedVersionInfo.MetaEntry + 26, // 36: proto.CheckinObserved.units:type_name -> proto.UnitObserved + 27, // 37: proto.CheckinObserved.version_info:type_name -> proto.CheckinObservedVersionInfo + 36, // 38: proto.CheckinObserved.units_timestamp:type_name -> google.protobuf.Timestamp + 0, // 39: proto.CheckinObserved.supports:type_name -> proto.ConnectionSupports + 2, // 40: proto.ActionRequest.unit_type:type_name -> proto.UnitType + 6, // 41: proto.ActionRequest.type:type_name -> proto.ActionRequest.Type + 7, // 42: proto.ActionRequest.level:type_name -> proto.ActionRequest.Level + 36, // 43: proto.ActionDiagnosticUnitResult.generated:type_name -> google.protobuf.Timestamp + 8, // 44: proto.ActionResponse.status:type_name -> proto.ActionResponse.Status + 30, // 45: proto.ActionResponse.diagnostic:type_name -> proto.ActionDiagnosticUnitResult + 5, // 46: proto.StartUpInfo.services:type_name -> proto.ConnInfoServices + 0, // 47: proto.StartUpInfo.supports:type_name -> proto.ConnectionSupports + 15, // 48: proto.StartUpInfo.agent_info:type_name -> proto.AgentInfo + 23, // 49: proto.GlobalProcessorsConfig.ConfigsEntry.value:type_name -> proto.ProcessorConfig + 28, // 50: proto.ElasticAgent.CheckinV2:input_type -> proto.CheckinObserved + 31, // 51: proto.ElasticAgent.Actions:input_type -> proto.ActionResponse + 37, // 52: proto.ElasticAgent.Checkin:input_type -> proto.StateObserved + 25, // 53: proto.ElasticAgent.CheckinV2:output_type -> proto.CheckinExpected + 29, // 54: proto.ElasticAgent.Actions:output_type -> proto.ActionRequest + 38, // 55: proto.ElasticAgent.Checkin:output_type -> proto.StateExpected + 53, // [53:56] is the sub-list for method output_type + 50, // [50:53] is the sub-list for method input_type + 50, // [50:50] is the sub-list for extension type_name + 50, // [50:50] is the sub-list for extension extendee + 0, // [0:50] is the sub-list for field type_name } func init() { file_elastic_agent_client_proto_init() } @@ -2942,7 +3109,7 @@ func file_elastic_agent_client_proto_init() { } } file_elastic_agent_client_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckinExpected); i { + switch v := v.(*ProcessorConfig); i { case 0: return &v.state case 1: @@ -2954,7 +3121,7 @@ func file_elastic_agent_client_proto_init() { } } file_elastic_agent_client_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnitObserved); i { + switch v := v.(*GlobalProcessorsConfig); i { case 0: return &v.state case 1: @@ -2966,7 +3133,7 @@ func file_elastic_agent_client_proto_init() { } } file_elastic_agent_client_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckinObservedVersionInfo); i { + switch v := v.(*CheckinExpected); i { case 0: return &v.state case 1: @@ -2978,7 +3145,7 @@ func file_elastic_agent_client_proto_init() { } } file_elastic_agent_client_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckinObserved); i { + switch v := v.(*UnitObserved); i { case 0: return &v.state case 1: @@ -2990,7 +3157,7 @@ func file_elastic_agent_client_proto_init() { } } file_elastic_agent_client_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActionRequest); i { + switch v := v.(*CheckinObservedVersionInfo); i { case 0: return &v.state case 1: @@ -3002,7 +3169,7 @@ func file_elastic_agent_client_proto_init() { } } file_elastic_agent_client_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActionDiagnosticUnitResult); i { + switch v := v.(*CheckinObserved); i { case 0: return &v.state case 1: @@ -3014,7 +3181,7 @@ func file_elastic_agent_client_proto_init() { } } file_elastic_agent_client_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActionResponse); i { + switch v := v.(*ActionRequest); i { case 0: return &v.state case 1: @@ -3026,6 +3193,30 @@ func file_elastic_agent_client_proto_init() { } } file_elastic_agent_client_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActionDiagnosticUnitResult); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_elastic_agent_client_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_elastic_agent_client_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartUpInfo); i { case 0: return &v.state @@ -3039,14 +3230,14 @@ func file_elastic_agent_client_proto_init() { } } file_elastic_agent_client_proto_msgTypes[12].OneofWrappers = []interface{}{} - file_elastic_agent_client_proto_msgTypes[17].OneofWrappers = []interface{}{} + file_elastic_agent_client_proto_msgTypes[19].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_elastic_agent_client_proto_rawDesc, NumEnums: 9, - NumMessages: 23, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, From 987e33ca9e14e5a6073f65a58fe7320f69c15c46 Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Fri, 28 Jun 2024 14:41:07 +0200 Subject: [PATCH 2/4] WIP opt-in component config --- pkg/client/client_v2.go | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/pkg/client/client_v2.go b/pkg/client/client_v2.go index 8c45287..eef17ce 100644 --- a/pkg/client/client_v2.go +++ b/pkg/client/client_v2.go @@ -192,10 +192,11 @@ type V2 interface { // v2options hold the client options. type v2options struct { - maxMessageSize int - chunkingAllowed bool - dialOptions []grpc.DialOption - agentInfo *AgentInfo + maxMessageSize int + chunkingAllowed bool + dialOptions []grpc.DialOption + agentInfo *AgentInfo + emitComponentChanges bool } // DialOptions returns the dial options for the GRPC connection. @@ -238,6 +239,12 @@ func WithAgentInfo(agentInfo AgentInfo) V2ClientOption { } } +func WithEmitComponentChanges(emitComponentChanges bool) V2ClientOption { + return func(o *v2options) { + o.emitComponentChanges = emitComponentChanges + } +} + // clientV2 manages the state and communication to the Elastic Agent over the V2 control protocol. type clientV2 struct { target string @@ -255,8 +262,9 @@ type clientV2 struct { wg sync.WaitGroup client proto.ElasticAgentClient - errCh chan error - changesCh chan UnitChanged + errCh chan error + changesCh chan UnitChanged + componentChangesCh chan *proto.Component // stateChangeObservedCh is an internal channel that notifies checkinWriter // that a unit state has changed. To trigger it, call unitsStateChanged. @@ -644,6 +652,18 @@ func (c *clientV2) syncComponent(expected *proto.CheckinExpected) { } } + if c.opts.emitComponentChanges { + // we have to publish the new component config + select { + case c.componentChangesCh <- expected.Component: + // all good we managed to process the component config + case <-time.After(500 * time.Millisecond): + //TODO something went wrong, log and drop + return + } + + } + // Technically we should wait until the APM config is also applied, but the syncUnits is called after this and // we have a single index for the whole component c.componentConfig = expected.Component From b26a8ccf196e22b8e921351b70e9fd2a750083f2 Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Wed, 3 Jul 2024 15:49:48 +0200 Subject: [PATCH 3/4] Add ComponentChanges support --- pkg/client/client_v2.go | 31 ++++++-- pkg/client/client_v2_test.go | 133 +++++++++++++++++++++++++++++++-- pkg/client/component.go | 55 ++++++++++++++ pkg/client/component_mapper.go | 86 +++++++++++++++++++++ 4 files changed, 292 insertions(+), 13 deletions(-) create mode 100644 pkg/client/component.go create mode 100644 pkg/client/component_mapper.go diff --git a/pkg/client/client_v2.go b/pkg/client/client_v2.go index eef17ce..d059490 100644 --- a/pkg/client/client_v2.go +++ b/pkg/client/client_v2.go @@ -169,6 +169,11 @@ type V2 interface { // // User of this client must read from this channel, or it will block the client. UnitChanges() <-chan UnitChanged + // ComponentChanges returns the channel where the client will publish Component configuration changes + // + // Support for this changes must be opted in (in order to maintain backward compatibility, refer to the actual implementation for details) + // Component changes (if present) will be published *before* any unit change coming from the same message. + ComponentChanges() <-chan Component // Errors returns channel of errors that occurred during communication. // // User of this client must read from this channel, or it will block the client. @@ -264,7 +269,7 @@ type clientV2 struct { errCh chan error changesCh chan UnitChanged - componentChangesCh chan *proto.Component + componentChangesCh chan Component // stateChangeObservedCh is an internal channel that notifies checkinWriter // that a unit state has changed. To trigger it, call unitsStateChanged. @@ -319,6 +324,7 @@ func NewV2(target string, token string, versionInfo VersionInfo, opts ...V2Clien versionInfo: versionInfo, stateChangeObservedCh: make(chan struct{}, 1), errCh: make(chan error), + componentChangesCh: make(chan Component), changesCh: make(chan UnitChanged), diagHooks: make(map[string]diagHook), minCheckTimeout: CheckinMinimumTimeout, @@ -353,6 +359,11 @@ func (c *clientV2) Stop() { } } +// ComponentChanges returns channel client will publish component change notifications to. +func (c *clientV2) ComponentChanges() <-chan Component { + return c.componentChangesCh +} + // UnitChanges returns channel client send unit change notifications to. func (c *clientV2) UnitChanges() <-chan UnitChanged { return c.changesCh @@ -654,14 +665,18 @@ func (c *clientV2) syncComponent(expected *proto.CheckinExpected) { if c.opts.emitComponentChanges { // we have to publish the new component config - select { - case c.componentChangesCh <- expected.Component: - // all good we managed to process the component config - case <-time.After(500 * time.Millisecond): - //TODO something went wrong, log and drop - return - } + component := MapComponent(expected.Component) + if component != nil && expected.ComponentIdx != c.componentIdx { + const publishTimeout = 500 * time.Millisecond + select { + case c.componentChangesCh <- *component: + // all good we managed to process the component config + case <-time.After(publishTimeout): + c.errCh <- fmt.Errorf("timed out after %s writing component config to publish channel, dropping component config index %d", publishTimeout, component.ConfigIdx) + return + } + } } // Technically we should wait until the APM config is also applied, but the syncUnits is called after this and diff --git a/pkg/client/client_v2_test.go b/pkg/client/client_v2_test.go index b7afea4..8e3c9a0 100644 --- a/pkg/client/client_v2_test.go +++ b/pkg/client/client_v2_test.go @@ -21,6 +21,7 @@ import ( "testing" "time" + "github.com/elastic/elastic-agent-libs/atomic" "github.com/google/pprof/profile" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -28,6 +29,7 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" gproto "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/structpb" "github.com/elastic/elastic-agent-client/v7/pkg/client/mock" "github.com/elastic/elastic-agent-client/v7/pkg/proto" @@ -1138,12 +1140,12 @@ func TestClientV2_Checkin_APMConfig(t *testing.T) { } } -type componentConfigServerValidation struct { - componentIdx uint64 - goMaxProcs int -} - func TestClientV2_Checkin_Component(t *testing.T) { + type componentConfigServerValidation struct { + componentIdx uint64 + goMaxProcs int + } + var m sync.Mutex token := mock.NewID() connected := false @@ -1332,6 +1334,121 @@ func TestClientV2_Checkin_Component(t *testing.T) { } } +func TestClientV2_Checkin_OptInComponent(t *testing.T) { + + type args struct { + checkinExpectedGenerator mock.StubServerCheckinV2 + } + + type expected struct { + componentExpected *proto.Component + expectedComponentIdx uint64 + unitsExpected []Unit + numberOfComponentConfigs uint + } + + testcases := []struct { + name string + args args + expected expected + }{ + { + name: "Simple component config", + args: args{ + checkinExpectedGenerator: func(observed *proto.CheckinObserved) *proto.CheckinExpected { + + expectedComponentIdx := uint64(1) + + if observed.ComponentIdx != expectedComponentIdx { + + return &proto.CheckinExpected{ + ComponentIdx: expectedComponentIdx, + Component: &proto.Component{ + Processors: &proto.GlobalProcessorsConfig{ + Configs: map[string]*proto.ProcessorConfig{ + "provider1": {Enabled: true, Config: mustStructFromMap(t, nil)}, + }, + }, + }, + Units: []*proto.UnitExpected{}, + } + } + // disconnect otherwise + return nil + }, + }, + expected: expected{ + componentExpected: &proto.Component{ + Processors: &proto.GlobalProcessorsConfig{ + Configs: map[string]*proto.ProcessorConfig{ + "provider1": {Enabled: true, Config: mustStructFromMap(t, nil)}, + }, + }, + }, + expectedComponentIdx: 1, + unitsExpected: nil, + numberOfComponentConfigs: 1, + }, + }, + } + + for _, tt := range testcases { + t.Run(tt.name, func(t *testing.T) { + srv := mock.StubServerV2{ + CheckinV2Impl: tt.args.checkinExpectedGenerator, + ActionImpl: func(response *proto.ActionResponse) error { + // actions not tested here + t.Logf("handling action response %v", response) + return nil + }, + ActionsChan: make(chan *mock.PerformAction, 100), + } + require.NoError(t, srv.Start()) + defer srv.Stop() + + var errsMu sync.Mutex + var errs []error + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + serverAddr := fmt.Sprintf(":%d", srv.Port) + token := mock.NewID() + v2Client := NewV2(serverAddr, token, VersionInfo{}, WithGRPCDialOptions(grpc.WithTransportCredentials(insecure.NewCredentials())), WithEmitComponentChanges(true)).(*clientV2) + v2Client.minCheckTimeout = 100 * time.Millisecond // otherwise the test will run for too long + storeErrors(ctx, v2Client, &errs, &errsMu) + require.NoError(t, v2Client.Start(ctx)) + defer v2Client.Stop() + + componentConfigsReceived := atomic.MakeUint(0) + + go func() { + t.Log("consumer goroutine started...") + for { + select { + case <-ctx.Done(): + t.Log("consumer goroutine exiting...") + return + case cc := <-v2Client.ComponentChanges(): + t.Logf("component received: %+v", cc) + componentConfigsReceived.Inc() + case <-v2Client.UnitChanges(): // otherwise the v2Client can block forever + // we don't need to react to units since we test the component-level change + t.Logf("unit received") + } + } + }() + + // wait until we processed the target componentIdx + assert.Eventually(t, func() bool { + return v2Client.componentIdx == tt.expected.expectedComponentIdx + }, 10*time.Second, 500*time.Millisecond, "didn't process up to the expected componentIdx") + + assert.Equal(t, tt.expected.numberOfComponentConfigs, componentConfigsReceived.Load(), "didn't receive the expected number of component configs") + assert.True(t, gproto.Equal(tt.expected.componentExpected, v2Client.componentConfig), "last component stored by client \n%s\n is different from expected\n%s", v2Client.componentConfig, tt.expected.componentExpected) + }) + } +} + func setupClientForDiagnostics(ctx context.Context, t *testing.T) (*Unit, V2, mock.StubServerV2) { var m sync.Mutex token := mock.NewID() @@ -1453,3 +1570,9 @@ func updateUnits(t *testing.T, observed *proto.CheckinObserved, units ...*Unit) } } } + +func mustStructFromMap(t *testing.T, m map[string]any) *structpb.Struct { + newStruct, err := structpb.NewStruct(m) + require.NoErrorf(t, err, "unable to create struct from %s", m) + return newStruct +} diff --git a/pkg/client/component.go b/pkg/client/component.go new file mode 100644 index 0000000..d650dc2 --- /dev/null +++ b/pkg/client/component.go @@ -0,0 +1,55 @@ +package client + +import ( + "github.com/elastic/elastic-agent-client/v7/pkg/proto" +) + +// Component limits +type Limits struct { + maxProcs uint64 +} + +// (Elastic) APM configuration +type ElasticAPMTLS struct { + // Elastic APM TLS config + SkipVerify bool + ServerCA string + ServerCert string +} + +type ElasticAPM struct { + TLS *ElasticAPMTLS + Environment string + APIKey string + SecretToken string + Hosts []string + GlobalLabels string +} + +// APM configuration +type APMConfig struct { + Elastic *ElasticAPM +} + +// Global processors config + +// A processor config. Enabled flag is a separate field to check easily activation/deactivation. All the rest of the config +// is in the generic Struct config field +type ProcessorConfig struct { + Enabled bool + Config map[string]any +} + +// Configure some global processors for event data at component level +type GlobalProcessorsConfig struct { + Configs map[string]*ProcessorConfig +} + +type Component struct { + Config *proto.Component + ConfigIdx uint64 + + Limits *Limits + APM *APMConfig + GlobalProcessors *GlobalProcessorsConfig +} diff --git a/pkg/client/component_mapper.go b/pkg/client/component_mapper.go new file mode 100644 index 0000000..52d895a --- /dev/null +++ b/pkg/client/component_mapper.go @@ -0,0 +1,86 @@ +package client + +import ( + "github.com/elastic/elastic-agent-client/v7/pkg/proto" +) + +func MapComponent(pc *proto.Component) (mapped *Component) { + if pc == nil { + return nil + } + + return &Component{ + Config: pc, + Limits: MapLimits(pc.Limits), + APM: MapAPM(pc.ApmConfig), + GlobalProcessors: MapGlobalProcessors(pc.Processors), + } +} + +func MapLimits(limits *proto.ComponentLimits) *Limits { + if limits == nil { + return nil + } + + return &Limits{maxProcs: limits.GoMaxProcs} +} + +func MapGlobalProcessors(pp *proto.GlobalProcessorsConfig) *GlobalProcessorsConfig { + if pp == nil { + return nil + } + + mapped := &GlobalProcessorsConfig{Configs: make(map[string]*ProcessorConfig, len(pp.Configs))} + + for k, v := range pp.Configs { + mapped.Configs[k] = mapProcessorConfig(v) + } + + return mapped +} + +func mapProcessorConfig(v *proto.ProcessorConfig) *ProcessorConfig { + if v == nil { + return nil + } + + return &ProcessorConfig{ + Enabled: v.Enabled, + Config: v.Config.AsMap(), + } +} + +func MapAPM(pa *proto.APMConfig) (mapped *APMConfig) { + if pa == nil { + return nil + } + + return &APMConfig{ + Elastic: MapElasticAPM(pa.Elastic), + } +} + +func MapElasticAPM(eAPM *proto.ElasticAPM) *ElasticAPM { + if eAPM == nil { + return nil + } + return &ElasticAPM{ + TLS: MapElasticAPMTLS(eAPM.Tls), + Environment: eAPM.Environment, + APIKey: eAPM.GetApiKey(), + SecretToken: eAPM.GetSecretToken(), + Hosts: eAPM.GetHosts(), + GlobalLabels: eAPM.GetGlobalLabels(), + } +} + +func MapElasticAPMTLS(eTLS *proto.ElasticAPMTLS) *ElasticAPMTLS { + if eTLS == nil { + return nil + } + return &ElasticAPMTLS{ + SkipVerify: eTLS.GetSkipVerify(), + ServerCA: eTLS.GetServerCa(), + ServerCert: eTLS.GetServerCert(), + } +} From 3179341caf2e26cc704f70957c6234cbc269a78e Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Fri, 12 Jul 2024 16:02:51 +0200 Subject: [PATCH 4/4] fixup! Add ComponentChanges support --- pkg/client/client_v2.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/client/client_v2.go b/pkg/client/client_v2.go index d059490..2dac970 100644 --- a/pkg/client/client_v2.go +++ b/pkg/client/client_v2.go @@ -667,6 +667,9 @@ func (c *clientV2) syncComponent(expected *proto.CheckinExpected) { // we have to publish the new component config component := MapComponent(expected.Component) + // Set ComponentIdx + component.ConfigIdx = expected.ComponentIdx + if component != nil && expected.ComponentIdx != c.componentIdx { const publishTimeout = 500 * time.Millisecond select {