diff --git a/Makefile b/Makefile index 20181c510be..2e69a089ae4 100644 --- a/Makefile +++ b/Makefile @@ -225,7 +225,7 @@ clean: cli-clean tarball-clean .PHONY: test test: tester-progs tetragon-bpf - $(GO) test -exec "$(SUDO)" -p 1 -parallel 1 $(GOFLAGS) -gcflags=$(GO_BUILD_GCFLAGS) -timeout $(GO_TEST_TIMEOUT) -failfast -cover ./pkg/... ./cmd/... ./operator/... ${EXTRA_TESTFLAGS} + $(GO) test -v -exec "$(SUDO)" -p 1 -parallel 1 $(GOFLAGS) -gcflags=$(GO_BUILD_GCFLAGS) -timeout $(GO_TEST_TIMEOUT) -failfast -cover ./pkg/... ./cmd/... ./operator/... ${EXTRA_TESTFLAGS} .PHONY: bench bench: diff --git a/api/v1/README.md b/api/v1/README.md index 7d08b82a250..7f193c00c4b 100644 --- a/api/v1/README.md +++ b/api/v1/README.md @@ -889,11 +889,12 @@ https://github.com/opencontainers/runtime-spec/blob/main/config.md#createcontain | args | [KprobeArgument](#tetragon-KprobeArgument) | repeated | Arguments definition of the observed kprobe. | | return | [KprobeArgument](#tetragon-KprobeArgument) | | Return value definition of the observed kprobe. | | action | [KprobeAction](#tetragon-KprobeAction) | | Action performed when the kprobe matched. | -| stack_trace | [StackTraceEntry](#tetragon-StackTraceEntry) | repeated | Kernel stack trace to the call. | +| kernel_stack_trace | [StackTraceEntry](#tetragon-StackTraceEntry) | repeated | Kernel stack trace to the call. | | policy_name | [string](#string) | | Name of the Tracing Policy that created that kprobe. | | return_action | [KprobeAction](#tetragon-KprobeAction) | | Action performed when the return kprobe executed. | | message | [string](#string) | | Short message of the Tracing Policy to inform users what is going on. | | tags | [string](#string) | repeated | Tags of the Tracing Policy to categorize the event. | +| user_stack_trace | [StackTraceEntry](#tetragon-StackTraceEntry) | repeated | User-mode stack trace to the call. | @@ -995,9 +996,10 @@ RuntimeHookRequest synchronously propagates information to the agent about run-t | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| address | [uint64](#uint64) | | address is the kernel function address. | +| address | [uint64](#uint64) | | linear address of the function in kernel or user space. | | offset | [uint64](#uint64) | | offset is the offset into the native instructions for the function. | | symbol | [string](#string) | | symbol is the symbol name of the function. | +| module | [string](#string) | | module path for user space addresses. | diff --git a/api/v1/tetragon/codegen/eventchecker/eventchecker.pb.go b/api/v1/tetragon/codegen/eventchecker/eventchecker.pb.go index 0a1e44db261..2213e2449d2 100644 --- a/api/v1/tetragon/codegen/eventchecker/eventchecker.pb.go +++ b/api/v1/tetragon/codegen/eventchecker/eventchecker.pb.go @@ -696,18 +696,19 @@ func (checker *ProcessExitChecker) FromProcessExit(event *tetragon.ProcessExit) // ProcessKprobeChecker implements a checker struct to check a ProcessKprobe event type ProcessKprobeChecker struct { - CheckerName string `json:"checkerName"` - Process *ProcessChecker `json:"process,omitempty"` - Parent *ProcessChecker `json:"parent,omitempty"` - FunctionName *stringmatcher.StringMatcher `json:"functionName,omitempty"` - Args *KprobeArgumentListMatcher `json:"args,omitempty"` - Return *KprobeArgumentChecker `json:"return,omitempty"` - Action *KprobeActionChecker `json:"action,omitempty"` - StackTrace *StackTraceEntryListMatcher `json:"stackTrace,omitempty"` - PolicyName *stringmatcher.StringMatcher `json:"policyName,omitempty"` - ReturnAction *KprobeActionChecker `json:"returnAction,omitempty"` - Message *stringmatcher.StringMatcher `json:"message,omitempty"` - Tags *StringListMatcher `json:"tags,omitempty"` + CheckerName string `json:"checkerName"` + Process *ProcessChecker `json:"process,omitempty"` + Parent *ProcessChecker `json:"parent,omitempty"` + FunctionName *stringmatcher.StringMatcher `json:"functionName,omitempty"` + Args *KprobeArgumentListMatcher `json:"args,omitempty"` + Return *KprobeArgumentChecker `json:"return,omitempty"` + Action *KprobeActionChecker `json:"action,omitempty"` + KernelStackTrace *StackTraceEntryListMatcher `json:"kernelStackTrace,omitempty"` + PolicyName *stringmatcher.StringMatcher `json:"policyName,omitempty"` + ReturnAction *KprobeActionChecker `json:"returnAction,omitempty"` + Message *stringmatcher.StringMatcher `json:"message,omitempty"` + Tags *StringListMatcher `json:"tags,omitempty"` + UserStackTrace *StackTraceEntryListMatcher `json:"userStackTrace,omitempty"` } // CheckEvent checks a single event and implements the EventChecker interface @@ -779,9 +780,9 @@ func (checker *ProcessKprobeChecker) Check(event *tetragon.ProcessKprobe) error return fmt.Errorf("Action check failed: %w", err) } } - if checker.StackTrace != nil { - if err := checker.StackTrace.Check(event.StackTrace); err != nil { - return fmt.Errorf("StackTrace check failed: %w", err) + if checker.KernelStackTrace != nil { + if err := checker.KernelStackTrace.Check(event.KernelStackTrace); err != nil { + return fmt.Errorf("KernelStackTrace check failed: %w", err) } } if checker.PolicyName != nil { @@ -804,6 +805,11 @@ func (checker *ProcessKprobeChecker) Check(event *tetragon.ProcessKprobe) error return fmt.Errorf("Tags check failed: %w", err) } } + if checker.UserStackTrace != nil { + if err := checker.UserStackTrace.Check(event.UserStackTrace); err != nil { + return fmt.Errorf("UserStackTrace check failed: %w", err) + } + } return nil } if err := fieldChecks(); err != nil { @@ -849,9 +855,9 @@ func (checker *ProcessKprobeChecker) WithAction(check tetragon.KprobeAction) *Pr return checker } -// WithStackTrace adds a StackTrace check to the ProcessKprobeChecker -func (checker *ProcessKprobeChecker) WithStackTrace(check *StackTraceEntryListMatcher) *ProcessKprobeChecker { - checker.StackTrace = check +// WithKernelStackTrace adds a KernelStackTrace check to the ProcessKprobeChecker +func (checker *ProcessKprobeChecker) WithKernelStackTrace(check *StackTraceEntryListMatcher) *ProcessKprobeChecker { + checker.KernelStackTrace = check return checker } @@ -880,6 +886,12 @@ func (checker *ProcessKprobeChecker) WithTags(check *StringListMatcher) *Process return checker } +// WithUserStackTrace adds a UserStackTrace check to the ProcessKprobeChecker +func (checker *ProcessKprobeChecker) WithUserStackTrace(check *StackTraceEntryListMatcher) *ProcessKprobeChecker { + checker.UserStackTrace = check + return checker +} + //FromProcessKprobe populates the ProcessKprobeChecker using data from a ProcessKprobe event func (checker *ProcessKprobeChecker) FromProcessKprobe(event *tetragon.ProcessKprobe) *ProcessKprobeChecker { if event == nil { @@ -911,7 +923,7 @@ func (checker *ProcessKprobeChecker) FromProcessKprobe(event *tetragon.ProcessKp checker.Action = NewKprobeActionChecker(event.Action) { var checks []*StackTraceEntryChecker - for _, check := range event.StackTrace { + for _, check := range event.KernelStackTrace { var convertedCheck *StackTraceEntryChecker if check != nil { convertedCheck = NewStackTraceEntryChecker().FromStackTraceEntry(check) @@ -920,7 +932,7 @@ func (checker *ProcessKprobeChecker) FromProcessKprobe(event *tetragon.ProcessKp } lm := NewStackTraceEntryListMatcher().WithOperator(listmatcher.Ordered). WithValues(checks...) - checker.StackTrace = lm + checker.KernelStackTrace = lm } checker.PolicyName = stringmatcher.Full(event.PolicyName) checker.ReturnAction = NewKprobeActionChecker(event.ReturnAction) @@ -936,6 +948,19 @@ func (checker *ProcessKprobeChecker) FromProcessKprobe(event *tetragon.ProcessKp WithValues(checks...) checker.Tags = lm } + { + var checks []*StackTraceEntryChecker + for _, check := range event.UserStackTrace { + var convertedCheck *StackTraceEntryChecker + if check != nil { + convertedCheck = NewStackTraceEntryChecker().FromStackTraceEntry(check) + } + checks = append(checks, convertedCheck) + } + lm := NewStackTraceEntryListMatcher().WithOperator(listmatcher.Ordered). + WithValues(checks...) + checker.UserStackTrace = lm + } return checker } @@ -1082,7 +1107,7 @@ func (checker *StackTraceEntryListMatcher) Check(values []*tetragon.StackTraceEn func (checker *StackTraceEntryListMatcher) orderedCheck(values []*tetragon.StackTraceEntry) error { innerCheck := func(check *StackTraceEntryChecker, value *tetragon.StackTraceEntry) error { if err := check.Check(value); err != nil { - return fmt.Errorf("StackTrace check failed: %w", err) + return fmt.Errorf("KernelStackTrace check failed: %w", err) } return nil } @@ -1114,7 +1139,7 @@ func (checker *StackTraceEntryListMatcher) unorderedCheck(values []*tetragon.Sta func (checker *StackTraceEntryListMatcher) subsetCheck(values []*tetragon.StackTraceEntry) error { innerCheck := func(check *StackTraceEntryChecker, value *tetragon.StackTraceEntry) error { if err := check.Check(value); err != nil { - return fmt.Errorf("StackTrace check failed: %w", err) + return fmt.Errorf("KernelStackTrace check failed: %w", err) } return nil } @@ -6037,6 +6062,7 @@ type StackTraceEntryChecker struct { Address *uint64 `json:"address,omitempty"` Offset *uint64 `json:"offset,omitempty"` Symbol *stringmatcher.StringMatcher `json:"symbol,omitempty"` + Module *stringmatcher.StringMatcher `json:"module,omitempty"` } // NewStackTraceEntryChecker creates a new StackTraceEntryChecker @@ -6071,6 +6097,11 @@ func (checker *StackTraceEntryChecker) Check(event *tetragon.StackTraceEntry) er return fmt.Errorf("Symbol check failed: %w", err) } } + if checker.Module != nil { + if err := checker.Module.Match(event.Module); err != nil { + return fmt.Errorf("Module check failed: %w", err) + } + } return nil } if err := fieldChecks(); err != nil { @@ -6097,6 +6128,12 @@ func (checker *StackTraceEntryChecker) WithSymbol(check *stringmatcher.StringMat return checker } +// WithModule adds a Module check to the StackTraceEntryChecker +func (checker *StackTraceEntryChecker) WithModule(check *stringmatcher.StringMatcher) *StackTraceEntryChecker { + checker.Module = check + return checker +} + //FromStackTraceEntry populates the StackTraceEntryChecker using data from a StackTraceEntry field func (checker *StackTraceEntryChecker) FromStackTraceEntry(event *tetragon.StackTraceEntry) *StackTraceEntryChecker { if event == nil { @@ -6111,6 +6148,7 @@ func (checker *StackTraceEntryChecker) FromStackTraceEntry(event *tetragon.Stack checker.Offset = &val } checker.Symbol = stringmatcher.Full(event.Symbol) + checker.Module = stringmatcher.Full(event.Module) return checker } diff --git a/api/v1/tetragon/tetragon.pb.go b/api/v1/tetragon/tetragon.pb.go index 9f8305e56b9..51342e67011 100644 --- a/api/v1/tetragon/tetragon.pb.go +++ b/api/v1/tetragon/tetragon.pb.go @@ -3047,7 +3047,7 @@ type ProcessKprobe struct { // Action performed when the kprobe matched. Action KprobeAction `protobuf:"varint,6,opt,name=action,proto3,enum=tetragon.KprobeAction" json:"action,omitempty"` // Kernel stack trace to the call. - StackTrace []*StackTraceEntry `protobuf:"bytes,7,rep,name=stack_trace,json=stackTrace,proto3" json:"stack_trace,omitempty"` + KernelStackTrace []*StackTraceEntry `protobuf:"bytes,7,rep,name=kernel_stack_trace,json=kernelStackTrace,proto3" json:"kernel_stack_trace,omitempty"` // Name of the Tracing Policy that created that kprobe. PolicyName string `protobuf:"bytes,8,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` // Action performed when the return kprobe executed. @@ -3056,6 +3056,8 @@ type ProcessKprobe struct { Message string `protobuf:"bytes,10,opt,name=message,proto3" json:"message,omitempty"` // Tags of the Tracing Policy to categorize the event. Tags []string `protobuf:"bytes,11,rep,name=tags,proto3" json:"tags,omitempty"` + // User-mode stack trace to the call. + UserStackTrace []*StackTraceEntry `protobuf:"bytes,12,rep,name=user_stack_trace,json=userStackTrace,proto3" json:"user_stack_trace,omitempty"` } func (x *ProcessKprobe) Reset() { @@ -3132,9 +3134,9 @@ func (x *ProcessKprobe) GetAction() KprobeAction { return KprobeAction_KPROBE_ACTION_UNKNOWN } -func (x *ProcessKprobe) GetStackTrace() []*StackTraceEntry { +func (x *ProcessKprobe) GetKernelStackTrace() []*StackTraceEntry { if x != nil { - return x.StackTrace + return x.KernelStackTrace } return nil } @@ -3167,6 +3169,13 @@ func (x *ProcessKprobe) GetTags() []string { return nil } +func (x *ProcessKprobe) GetUserStackTrace() []*StackTraceEntry { + if x != nil { + return x.UserStackTrace + } + return nil +} + type ProcessTracepoint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3947,12 +3956,14 @@ type StackTraceEntry struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // address is the kernel function address. + // linear address of the function in kernel or user space. Address uint64 `protobuf:"varint,1,opt,name=address,proto3" json:"address,omitempty"` // offset is the offset into the native instructions for the function. Offset uint64 `protobuf:"varint,2,opt,name=offset,proto3" json:"offset,omitempty"` // symbol is the symbol name of the function. Symbol string `protobuf:"bytes,3,opt,name=symbol,proto3" json:"symbol,omitempty"` + // module path for user space addresses. + Module string `protobuf:"bytes,4,opt,name=module,proto3" json:"module,omitempty"` } func (x *StackTraceEntry) Reset() { @@ -4008,6 +4019,13 @@ func (x *StackTraceEntry) GetSymbol() string { return "" } +func (x *StackTraceEntry) GetModule() string { + if x != nil { + return x.Module + } + return "" +} + var File_tetragon_tetragon_proto protoreflect.FileDescriptor var file_tetragon_tetragon_proto_rawDesc = []byte{ @@ -4452,7 +4470,7 @@ var file_tetragon_tetragon_proto_rawDesc = []byte{ 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x4e, 0x65, 0x74, 0x44, 0x65, 0x76, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x44, 0x65, 0x76, 0x41, 0x72, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x42, 0x05, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x22, 0xe4, 0x03, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x42, 0x05, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x22, 0xb6, 0x04, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, @@ -4470,185 +4488,192 @@ var file_tetragon_tetragon_proto_rawDesc = []byte{ 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x0b, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, - 0x62, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x22, 0xc6, 0x02, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x54, 0x72, 0x61, 0x63, 0x65, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, - 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x07, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, - 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x2c, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x12, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, + 0x67, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x10, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, + 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, + 0x73, 0x12, 0x43, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, + 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x22, 0xc6, 0x02, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x54, 0x72, 0x61, 0x63, 0x65, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x07, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, + 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, + 0x62, 0x65, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, + 0x6f, 0x62, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, + 0x90, 0x02, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x55, 0x70, 0x72, 0x6f, 0x62, + 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x2c, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, - 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x16, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, - 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, - 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x90, 0x02, - 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x55, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x12, - 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, - 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, - 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, - 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x41, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x22, 0x96, 0x01, 0x0a, 0x0c, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x5f, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, - 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x4f, 0x6b, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, - 0x2e, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x69, 0x74, 0x73, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x07, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x04, 0x54, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x04, 0x61, 0x72, 0x67, 0x30, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x31, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, - 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, 0x32, 0x12, 0x12, 0x0a, - 0x04, 0x61, 0x72, 0x67, 0x33, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, - 0x33, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1a, - 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x74, 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, - 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x56, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x74, 0x72, + 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, + 0x67, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x0c, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x5f, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x4f, 0x6b, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, + 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x69, 0x74, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x07, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x04, 0x54, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, 0x30, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x31, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x61, + 0x72, 0x67, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, 0x32, 0x12, + 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x33, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, + 0x72, 0x67, 0x33, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, + 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, + 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0x6a, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x64, 0x22, 0x64, 0x0a, 0x12, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x74, - 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x6f, 0x6f, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x0f, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, - 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x72, 0x12, 0x4c, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3e, 0x0a, 0x10, - 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, 0x5b, 0x0a, 0x0f, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2a, 0x95, 0x03, 0x0a, 0x0c, 0x4b, 0x70, - 0x72, 0x6f, 0x62, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x50, - 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, - 0x16, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, - 0x4f, 0x4c, 0x4c, 0x4f, 0x57, 0x46, 0x44, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x50, 0x52, - 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x49, 0x47, 0x4b, 0x49, - 0x4c, 0x4c, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, - 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x46, 0x4f, 0x4c, 0x4c, 0x4f, 0x57, 0x46, 0x44, - 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x10, 0x05, 0x12, 0x18, - 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x43, 0x4f, 0x50, 0x59, 0x46, 0x44, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, - 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x45, 0x54, 0x55, 0x52, 0x4c, - 0x10, 0x07, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4e, 0x53, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x10, 0x08, 0x12, - 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x4e, 0x4f, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, - 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, - 0x4c, 0x10, 0x0a, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x53, 0x4f, 0x43, 0x4b, 0x10, 0x0b, - 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x55, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x53, 0x4f, 0x43, 0x4b, 0x10, 0x0c, 0x12, - 0x20, 0x0a, 0x1c, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x59, 0x45, 0x4e, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x52, 0x10, - 0x0d, 0x2a, 0x4f, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x44, 0x45, - 0x46, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x10, 0x01, 0x2a, 0x7c, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x45, 0x41, 0x4c, - 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x10, - 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, - 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, - 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x45, 0x41, 0x4c, 0x54, - 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, - 0x2a, 0x8d, 0x02, 0x0a, 0x0f, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x69, 0x74, 0x73, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x55, 0x4e, - 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x50, - 0x52, 0x4f, 0x50, 0x52, 0x49, 0x45, 0x54, 0x41, 0x52, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, - 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x46, 0x4f, 0x52, - 0x43, 0x45, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, - 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x5f, 0x55, 0x4e, 0x4c, - 0x4f, 0x41, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x13, - 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x4d, 0x4f, 0x44, - 0x55, 0x4c, 0x45, 0x10, 0x80, 0x08, 0x12, 0x1d, 0x0a, 0x18, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, - 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x54, 0x52, 0x45, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x55, - 0x4c, 0x45, 0x10, 0x80, 0x20, 0x12, 0x1a, 0x0a, 0x15, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x55, - 0x4e, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, - 0x40, 0x12, 0x24, 0x0a, 0x1e, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, - 0x4c, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x4f, 0x44, - 0x55, 0x4c, 0x45, 0x10, 0x80, 0x80, 0x02, 0x12, 0x17, 0x0a, 0x11, 0x54, 0x41, 0x49, 0x4e, 0x54, - 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x80, 0x10, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x56, 0x0a, 0x17, 0x47, 0x65, 0x74, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, + 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x6a, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x64, 0x22, 0x64, 0x0a, + 0x12, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, + 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x0f, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x72, 0x12, 0x4c, 0x0a, 0x0b, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3e, + 0x0a, 0x10, 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, 0x73, + 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x2a, 0x95, 0x03, 0x0a, 0x0c, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x16, 0x0a, 0x12, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4b, 0x50, 0x52, 0x4f, 0x42, + 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, 0x4c, 0x4c, 0x4f, 0x57, 0x46, + 0x44, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x49, 0x47, 0x4b, 0x49, 0x4c, 0x4c, 0x10, 0x03, 0x12, 0x1c, + 0x0a, 0x18, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x55, 0x4e, 0x46, 0x4f, 0x4c, 0x4c, 0x4f, 0x57, 0x46, 0x44, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, + 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4f, 0x56, + 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, + 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x46, 0x44, + 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x45, 0x54, 0x55, 0x52, 0x4c, 0x10, 0x07, 0x12, 0x1b, 0x0a, 0x17, + 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4e, + 0x53, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, + 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x50, 0x4f, 0x53, + 0x54, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x4c, 0x10, 0x0a, 0x12, 0x1b, 0x0a, + 0x17, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, + 0x52, 0x41, 0x43, 0x4b, 0x53, 0x4f, 0x43, 0x4b, 0x10, 0x0b, 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x50, + 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x54, 0x52, + 0x41, 0x43, 0x4b, 0x53, 0x4f, 0x43, 0x4b, 0x10, 0x0c, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x50, 0x52, + 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, + 0x59, 0x45, 0x4e, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x52, 0x10, 0x0d, 0x2a, 0x4f, 0x0a, 0x10, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1c, 0x0a, 0x18, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x10, 0x00, 0x12, 0x1d, 0x0a, + 0x19, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x01, 0x2a, 0x7c, 0x0a, 0x12, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, + 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, + 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, + 0x02, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x2a, 0x8d, 0x02, 0x0a, 0x0f, 0x54, + 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x69, 0x74, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, + 0x0a, 0x0b, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, + 0x1c, 0x0a, 0x18, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x52, 0x49, 0x45, + 0x54, 0x41, 0x52, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, + 0x13, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x5f, 0x4d, 0x4f, + 0x44, 0x55, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, + 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x5f, 0x55, 0x4e, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4d, 0x4f, + 0x44, 0x55, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, + 0x53, 0x54, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x08, + 0x12, 0x1d, 0x0a, 0x18, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, + 0x5f, 0x54, 0x52, 0x45, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x20, 0x12, + 0x1a, 0x0a, 0x15, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x49, 0x47, 0x4e, 0x45, + 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x40, 0x12, 0x24, 0x0a, 0x1e, 0x54, + 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x4c, 0x49, 0x56, 0x45, + 0x5f, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x80, + 0x02, 0x12, 0x17, 0x0a, 0x11, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, + 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x80, 0x10, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -4806,29 +4831,30 @@ var file_tetragon_tetragon_proto_depIdxs = []int32{ 31, // 81: tetragon.ProcessKprobe.args:type_name -> tetragon.KprobeArgument 31, // 82: tetragon.ProcessKprobe.return:type_name -> tetragon.KprobeArgument 0, // 83: tetragon.ProcessKprobe.action:type_name -> tetragon.KprobeAction - 44, // 84: tetragon.ProcessKprobe.stack_trace:type_name -> tetragon.StackTraceEntry + 44, // 84: tetragon.ProcessKprobe.kernel_stack_trace:type_name -> tetragon.StackTraceEntry 0, // 85: tetragon.ProcessKprobe.return_action:type_name -> tetragon.KprobeAction - 15, // 86: tetragon.ProcessTracepoint.process:type_name -> tetragon.Process - 15, // 87: tetragon.ProcessTracepoint.parent:type_name -> tetragon.Process - 31, // 88: tetragon.ProcessTracepoint.args:type_name -> tetragon.KprobeArgument - 0, // 89: tetragon.ProcessTracepoint.action:type_name -> tetragon.KprobeAction - 15, // 90: tetragon.ProcessUprobe.process:type_name -> tetragon.Process - 15, // 91: tetragon.ProcessUprobe.parent:type_name -> tetragon.Process - 31, // 92: tetragon.ProcessUprobe.args:type_name -> tetragon.KprobeArgument - 53, // 93: tetragon.KernelModule.signature_ok:type_name -> google.protobuf.BoolValue - 3, // 94: tetragon.KernelModule.tainted:type_name -> tetragon.TaintedBitsType - 1, // 95: tetragon.GetHealthStatusRequest.event_set:type_name -> tetragon.HealthStatusType - 1, // 96: tetragon.HealthStatus.event:type_name -> tetragon.HealthStatusType - 2, // 97: tetragon.HealthStatus.status:type_name -> tetragon.HealthStatusResult - 38, // 98: tetragon.GetHealthStatusResponse.health_status:type_name -> tetragon.HealthStatus - 15, // 99: tetragon.ProcessLoader.process:type_name -> tetragon.Process - 43, // 100: tetragon.RuntimeHookRequest.createContainer:type_name -> tetragon.CreateContainer - 46, // 101: tetragon.CreateContainer.annotations:type_name -> tetragon.CreateContainer.AnnotationsEntry - 102, // [102:102] is the sub-list for method output_type - 102, // [102:102] is the sub-list for method input_type - 102, // [102:102] is the sub-list for extension type_name - 102, // [102:102] is the sub-list for extension extendee - 0, // [0:102] is the sub-list for field type_name + 44, // 86: tetragon.ProcessKprobe.user_stack_trace:type_name -> tetragon.StackTraceEntry + 15, // 87: tetragon.ProcessTracepoint.process:type_name -> tetragon.Process + 15, // 88: tetragon.ProcessTracepoint.parent:type_name -> tetragon.Process + 31, // 89: tetragon.ProcessTracepoint.args:type_name -> tetragon.KprobeArgument + 0, // 90: tetragon.ProcessTracepoint.action:type_name -> tetragon.KprobeAction + 15, // 91: tetragon.ProcessUprobe.process:type_name -> tetragon.Process + 15, // 92: tetragon.ProcessUprobe.parent:type_name -> tetragon.Process + 31, // 93: tetragon.ProcessUprobe.args:type_name -> tetragon.KprobeArgument + 53, // 94: tetragon.KernelModule.signature_ok:type_name -> google.protobuf.BoolValue + 3, // 95: tetragon.KernelModule.tainted:type_name -> tetragon.TaintedBitsType + 1, // 96: tetragon.GetHealthStatusRequest.event_set:type_name -> tetragon.HealthStatusType + 1, // 97: tetragon.HealthStatus.event:type_name -> tetragon.HealthStatusType + 2, // 98: tetragon.HealthStatus.status:type_name -> tetragon.HealthStatusResult + 38, // 99: tetragon.GetHealthStatusResponse.health_status:type_name -> tetragon.HealthStatus + 15, // 100: tetragon.ProcessLoader.process:type_name -> tetragon.Process + 43, // 101: tetragon.RuntimeHookRequest.createContainer:type_name -> tetragon.CreateContainer + 46, // 102: tetragon.CreateContainer.annotations:type_name -> tetragon.CreateContainer.AnnotationsEntry + 103, // [103:103] is the sub-list for method output_type + 103, // [103:103] is the sub-list for method input_type + 103, // [103:103] is the sub-list for extension type_name + 103, // [103:103] is the sub-list for extension extendee + 0, // [0:103] is the sub-list for field type_name } func init() { file_tetragon_tetragon_proto_init() } diff --git a/api/v1/tetragon/tetragon.proto b/api/v1/tetragon/tetragon.proto index 88d3b95ebaa..40cea5fd940 100644 --- a/api/v1/tetragon/tetragon.proto +++ b/api/v1/tetragon/tetragon.proto @@ -463,7 +463,7 @@ message ProcessKprobe { // Action performed when the kprobe matched. KprobeAction action = 6; // Kernel stack trace to the call. - repeated StackTraceEntry stack_trace = 7; + repeated StackTraceEntry kernel_stack_trace = 7; // Name of the Tracing Policy that created that kprobe. string policy_name = 8; // Action performed when the return kprobe executed. @@ -472,6 +472,8 @@ message ProcessKprobe { string message = 10; // Tags of the Tracing Policy to categorize the event. repeated string tags = 11; + // User-mode stack trace to the call. + repeated StackTraceEntry user_stack_trace = 12; } message ProcessTracepoint { @@ -618,10 +620,12 @@ message CreateContainer { } message StackTraceEntry { - // address is the kernel function address. + // linear address of the function in kernel or user space. uint64 address = 1; // offset is the offset into the native instructions for the function. uint64 offset = 2; // symbol is the symbol name of the function. string symbol = 3; + // module path for user space addresses. + string module = 4; } diff --git a/bpf/lib/common.h b/bpf/lib/common.h index 69c3dc6523c..acd23496346 100644 --- a/bpf/lib/common.h +++ b/bpf/lib/common.h @@ -4,8 +4,9 @@ #define _MSG_COMMON__ /* msg_common internal flags */ -#define MSG_COMMON_FLAG_RETURN BIT(0) -#define MSG_COMMON_FLAG_STACKTRACE BIT(1) +#define MSG_COMMON_FLAG_RETURN BIT(0) +#define MSG_COMMON_FLAG_KERNEL_STACKTRACE BIT(1) +#define MSG_COMMON_FLAG_USER_STACKTRACE BIT(2) /* Msg Layout */ struct msg_common { diff --git a/bpf/lib/generic.h b/bpf/lib/generic.h index ea31582e04d..38d6e4c3acc 100644 --- a/bpf/lib/generic.h +++ b/bpf/lib/generic.h @@ -44,7 +44,8 @@ struct msg_generic_kprobe { __u64 action; __u32 action_arg_id; // only one URL or FQDN action can be fired per match __u32 tid; // Thread ID that triggered the event - __u64 stack_id; // Stack trace ID on u32 and potential error, see flag in msg_common.flags + __u64 kernel_stack_id; // Kernel stack trace ID on u32 and potential error, see flag in msg_common.flags + __u64 user_stack_id; // User Stack trace ID /* anything above is shared with the userspace so it should match structs MsgGenericKprobe and MsgGenericTracepoint in Go */ char args[24000]; unsigned long a0, a1, a2, a3, a4; diff --git a/bpf/process/types/basic.h b/bpf/process/types/basic.h index fb4c1433cd3..ab42100897a 100644 --- a/bpf/process/types/basic.h +++ b/bpf/process/types/basic.h @@ -2264,18 +2264,25 @@ do_action(void *ctx, __u32 i, struct msg_generic_kprobe *e, if (rate_limit(ratelimit_interval, ratelimit_scope, e)) *post = false; #endif /* __LARGE_BPF_PROG */ - __u32 stack_trace = actions->act[++i]; + __u32 kernel_stack_trace = actions->act[++i]; - if (stack_trace) { + if (kernel_stack_trace) { // Stack id 0 is valid so we need a flag. - e->common.flags |= MSG_COMMON_FLAG_STACKTRACE; + e->common.flags |= MSG_COMMON_FLAG_KERNEL_STACKTRACE; // We could use BPF_F_REUSE_STACKID to override old with new stack if // same stack id. It means that if we have a collision and user space // reads the old one too late, we are reading the wrong stack (the new, // old one was overwritten). // // Here we just signal that there was a collision returning -EEXIST. - e->stack_id = get_stackid(ctx, &stack_trace_map, 0); + e->kernel_stack_id = get_stackid(ctx, &stack_trace_map, 0); + } + + __u32 user_stack_trace = actions->act[++i]; + + if (user_stack_trace) { + e->common.flags |= MSG_COMMON_FLAG_USER_STACKTRACE; + e->user_stack_id = get_stackid(ctx, &stack_trace_map, BPF_F_USER_STACK); } break; } diff --git a/contrib/rthooks/tetragon-oci-hook/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.proto b/contrib/rthooks/tetragon-oci-hook/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.proto index 88d3b95ebaa..729ddd2931a 100644 --- a/contrib/rthooks/tetragon-oci-hook/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.proto +++ b/contrib/rthooks/tetragon-oci-hook/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.proto @@ -463,7 +463,7 @@ message ProcessKprobe { // Action performed when the kprobe matched. KprobeAction action = 6; // Kernel stack trace to the call. - repeated StackTraceEntry stack_trace = 7; + repeated StackTraceEntry kernel_stack_trace = 7; // Name of the Tracing Policy that created that kprobe. string policy_name = 8; // Action performed when the return kprobe executed. @@ -472,6 +472,8 @@ message ProcessKprobe { string message = 10; // Tags of the Tracing Policy to categorize the event. repeated string tags = 11; + // User space stack trace to the call. + repeated StackTraceEntry user_stack_trace = 12; } message ProcessTracepoint { diff --git a/contrib/tester-progs/Makefile b/contrib/tester-progs/Makefile index 77ff318a6eb..1e3f43c968e 100644 --- a/contrib/tester-progs/Makefile +++ b/contrib/tester-progs/Makefile @@ -22,7 +22,8 @@ PROGS = sigkill-tester \ drop-privileges \ getcpu \ direct-write-tester \ - change-capabilities + change-capabilities \ + user-stacktrace # For now enforcer-tester is compiled to 32-bit only on x86_64 as we want # to test 32-bit binaries and system calls compatibility layer. @@ -88,6 +89,9 @@ lseek-pipe: FORCE getcpu: FORCE go build -o getcpu ./go/getcpu +user-stacktrace: FORCE + go build -o user-stacktrace ./go/user-stacktrace + .PHONY: clean clean: rm -f $(PROGS) diff --git a/contrib/tester-progs/go/user-stacktrace/user-stacktrace.go b/contrib/tester-progs/go/user-stacktrace/user-stacktrace.go new file mode 100644 index 00000000000..28bd77ef8e8 --- /dev/null +++ b/contrib/tester-progs/go/user-stacktrace/user-stacktrace.go @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Authors of Tetragon + +package main + +import ( + "os" + "time" + "unsafe" + + "golang.org/x/sys/unix" +) + +//nolint:all +func main() { + // This test has endless loop for stable stack trace collection. + // It must be terminated from tests. + var cpu, node int + _, _, err := unix.Syscall( + unix.SYS_GETCPU, + uintptr(unsafe.Pointer(&cpu)), + uintptr(unsafe.Pointer(&node)), + 0, + ) + if err != 0 { + os.Exit(int(err)) + } + for { + time.Sleep(time.Minute) + } +} diff --git a/contrib/tester-progs/user-stacktrace b/contrib/tester-progs/user-stacktrace new file mode 100755 index 00000000000..4a4542df400 Binary files /dev/null and b/contrib/tester-progs/user-stacktrace differ diff --git a/docs/content/en/docs/concepts/tracing-policy/selectors.md b/docs/content/en/docs/concepts/tracing-policy/selectors.md index f1a8ee74483..c2d16c5d890 100644 --- a/docs/content/en/docs/concepts/tracing-policy/selectors.md +++ b/docs/content/en/docs/concepts/tracing-policy/selectors.md @@ -905,9 +905,10 @@ can be expanded to all processes by specifying the same with the value "global". #### Stack traces -`Post` takes the `stackTrace` parameter, when turned to `true` (by default to +`Post` takes the `kernelStackTrace` parameter, when turned to `true` (by default to `false`) it enables dump of the kernel stack trace to the hook point in kprobes -events. For example, the following kprobe hook can be used to retrieve the +events. To dump user space stack trace set `userStackTrace` parameter to `true`. +For example, the following kprobe hook can be used to retrieve the kernel stack to `kfree_skb_reason`, the function called in the kernel to drop kernel socket buffers. @@ -917,37 +918,41 @@ kprobes: selectors: - matchActions: - action: Post - stackTrace: true + kernelStackTrace: true + userStackTrace: true ``` {{< caution >}} -By default Tetragon does not expose the kernel addresses, you need to enable -the flag `--expose-kernel-addresses` to get the addresses along the rest. +By default Tetragon does not expose the linear addresses from kernel space or +user space, you need to enable the flag `--expose-stack-addresses` to get the addresses +along the rest. Note that the Tetragon agent is using its privilege to read the kernel symbols and their address. Being able to retrieve kernel symbols address can be used to break kernel address space layout randomization (KASLR) so only privileged users should be able to enable this feature and read events containing stack traces. +The same thing we can say about retrieving address for user mode processes. +Stack trace addresses can be used to bypass address space layout randomization (ASLR). {{< /caution >}} -Once loaded, events created from this policy will contain a new `stack_trace` +Once loaded, events created from this policy will contain a new `kernel_stack_trace` field on the `process_kprobe` event with an output similar to: ``` { - "address": "18446670264256120896", - "offset": "272", - "symbol": "skb_release_head_state" + "address": "18446744072119856613", + "offset": "5", + "symbol": "kfree_skb_reason" }, { - "address": "18446670264257081512", - "offset": "88", - "symbol": "ip_protocol_deliver_rcu" + "address": "18446744072119769755", + "offset": "107", + "symbol": "__sys_connect_file" }, { - "address": "18446670264257082152", - "offset": "88", - "symbol": "ip_local_deliver_finish" + "address": "18446744072119769989", + "offset": "181", + "symbol": "__sys_connect" }, [...] ``` @@ -955,29 +960,66 @@ field on the `process_kprobe` event with an output similar to: The "address" is the kernel function address, "offset" is the offset into the native instruction for the function and "symbol" is the function symbol name. +User mode stack trace is contained in `user_stack_trace` field on the +`process_kprobe` event and looks like: + +``` +{ + "address": "140498967885099", + "offset": "1209643", + "symbol": "__connect", + "module": "/usr/lib/x86_64-linux-gnu/libc.so.6" +}, +{ + "address": "140498968021470", + "offset": "1346014", + "symbol": "inet_pton", + "module": "/usr/lib/x86_64-linux-gnu/libc.so.6" +}, +{ + "address": "140498971185511", + "offset": "106855", + "module": "/usr/lib/x86_64-linux-gnu/libcurl.so.4.7.0" +}, +``` +The "address" is the function address, "offset" is the function offset from the +beginning of the binary module. "module" is the absolute path of the binary file +to which address belongs. "symbol" is the function symbol name. "symbol" may be missing +if the binary file is stripped. + +{{< note >}} +Information from `procfs (/proc//maps)` is used to symbolize user +stack trace addresses. Stack trace addresses extraction and symbolizing are async. +It might happen that process is terminated and the `/proc//maps` file will be +not existed at user stack trace symbolization step. In such case user stack traces +for very short living process might be not collected. +{{< /note >}} + This output can be enhanced in a more human friendly using the `tetra getevents -o compact` command. Indeed, by default, it will print the stack trace along the compact output of the event similarly to this: ``` -❓ syscall /usr/bin/curl kfree_skb_reason - 0xffffbcdee5bf4840: skb_release_head_state+0x110 - 0xffffbcdee5be3678: __sys_connect_file+0x88 - 0xffffbcdee5be376c: __sys_connect+0xbc - 0xffffbcdee5be37bc: __arm64_sys_connect+0x28 - 0xffffbcdee4dfcd68: invoke_syscall+0x78 - 0xffffbcdee4dfcf70: el0_svc_common.constprop.0+0x180 - 0xffffbcdee4dfcfa4: do_el0_svc+0x30 - 0xffffbcdee5e861e8: el0_svc+0x48 - 0xffffbcdee5e881b4: el0t_64_sync_handler+0xa4 - 0xffffbcdee4de1e38: el0t_64_sync+0x1a4 +❓ syscall /usr/bin/curl kfree_skb_reason +Kernel: + 0xffffffffa13f2de5: kfree_skb_reason+0x5 + 0xffffffffa13dda9b: __sys_connect_file+0x6b + 0xffffffffa13ddb85: __sys_connect+0xb5 + 0xffffffffa13ddbd8: __x64_sys_connect+0x18 + 0xffffffffa1714bd8: do_syscall_64+0x58 + 0xffffffffa18000e6: entry_SYSCALL_64_after_hwframe+0x6e +User space: + 0x7f878cf2752b: __connect (/usr/lib/x86_64-linux-gnu/libc.so.6+0x12752b) + 0x7f878cf489de: inet_pton (/usr/lib/x86_64-linux-gnu/libc.so.6+0x1489de) + 0x7f878d1b6167: (/usr/lib/x86_64-linux-gnu/libcurl.so.4.7.0+0x1a167) ``` -The printing format is `"0x%x: %s+0x%x", address, symbol, offset`. +The printing format for kernel stack trace is `"0x%x: %s+0x%x", address, symbol, offset`. +The printing format for user stack trace is `"0x%x: %s (%s+0x%x)", address, symbol, module, offset`. {{< note >}} Compact output will display missing addresses as `0x0`, see the above note on -`--expose-kernel-addresses` for more info. +`--expose-stack-addresses` for more info. {{< /note >}} ### NoPost action diff --git a/docs/content/en/docs/reference/grpc-api.md b/docs/content/en/docs/reference/grpc-api.md index dc79d02fb4d..8b4c68313d1 100644 --- a/docs/content/en/docs/reference/grpc-api.md +++ b/docs/content/en/docs/reference/grpc-api.md @@ -528,11 +528,12 @@ https://github.com/opencontainers/runtime-spec/blob/main/config.md#createcontain | args | [KprobeArgument](#tetragon-KprobeArgument) | repeated | Arguments definition of the observed kprobe. | | return | [KprobeArgument](#tetragon-KprobeArgument) | | Return value definition of the observed kprobe. | | action | [KprobeAction](#tetragon-KprobeAction) | | Action performed when the kprobe matched. | -| stack_trace | [StackTraceEntry](#tetragon-StackTraceEntry) | repeated | Kernel stack trace to the call. | +| kernel_stack_trace | [StackTraceEntry](#tetragon-StackTraceEntry) | repeated | Kernel stack trace to the call. | | policy_name | [string](#string) | | Name of the Tracing Policy that created that kprobe. | | return_action | [KprobeAction](#tetragon-KprobeAction) | | Action performed when the return kprobe executed. | | message | [string](#string) | | Short message of the Tracing Policy to inform users what is going on. | | tags | [string](#string) | repeated | Tags of the Tracing Policy to categorize the event. | +| user_stack_trace | [StackTraceEntry](#tetragon-StackTraceEntry) | repeated | User-mode stack trace to the call. | @@ -595,9 +596,10 @@ RuntimeHookRequest synchronously propagates information to the agent about run-t | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| address | [uint64](#uint64) | | address is the kernel function address. | +| address | [uint64](#uint64) | | linear address of the function in kernel or user space. | | offset | [uint64](#uint64) | | offset is the offset into the native instructions for the function. | | symbol | [string](#string) | | symbol is the symbol name of the function. | +| module | [string](#string) | | module path for user space addresses. | diff --git a/docs/data/tetragon_flags.yaml b/docs/data/tetragon_flags.yaml index 22fb29a9873..2ba91f4be0a 100644 --- a/docs/data/tetragon_flags.yaml +++ b/docs/data/tetragon_flags.yaml @@ -94,9 +94,9 @@ options: default_value: "-1" usage: | Rate limit (per minute) for event export. Set to -1 to disable - - name: expose-kernel-addresses + - name: expose-stack-addresses default_value: "false" - usage: Expose real kernel addresses in events stack traces + usage: Expose real linear addresses in events stack traces - name: field-filters usage: Field filters for event exports - name: force-large-progs diff --git a/examples/tracingpolicy/stack_traces.yaml b/examples/tracingpolicy/stack_traces.yaml index ca2eb6c2d94..538fbc4617e 100644 --- a/examples/tracingpolicy/stack_traces.yaml +++ b/examples/tracingpolicy/stack_traces.yaml @@ -15,4 +15,5 @@ spec: selectors: - matchActions: - action: Post - stackTrace: true + kernelStackTrace: true + userStackTrace: true diff --git a/go.mod b/go.mod index 02ca81c304c..07692034924 100644 --- a/go.mod +++ b/go.mod @@ -32,6 +32,7 @@ require ( github.com/pelletier/go-toml v1.9.5 github.com/prometheus/client_golang v1.19.0 github.com/prometheus/client_model v0.6.0 + github.com/prometheus/procfs v0.12.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 @@ -153,7 +154,6 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/prometheus/common v0.48.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect diff --git a/pkg/api/processapi/processapi.go b/pkg/api/processapi/processapi.go index dffcec3da15..372ad32f99a 100644 --- a/pkg/api/processapi/processapi.go +++ b/pkg/api/processapi/processapi.go @@ -40,8 +40,9 @@ const ( ExecveSetgidRoot = 0x10 // This binary execution gained new capabilities through setgid root execution // flags of MsgCommon - MSG_COMMON_FLAG_RETURN = 0x1 - MSG_COMMON_FLAG_STACKTRACE = 0x2 + MSG_COMMON_FLAG_RETURN = 0x1 + MSG_COMMON_FLAG_KERNEL_STACKTRACE = 0x2 + MSG_COMMON_FLAG_USER_STACKTRACE = 0x4 BINARY_PATH_MAX_LEN = 256 ) diff --git a/pkg/api/tracingapi/client_kprobe.go b/pkg/api/tracingapi/client_kprobe.go index 8f3fa8d8a4c..66c82827017 100644 --- a/pkg/api/tracingapi/client_kprobe.go +++ b/pkg/api/tracingapi/client_kprobe.go @@ -45,16 +45,17 @@ type MsgLoader struct { } type MsgGenericKprobe struct { - Common processapi.MsgCommon - ProcessKey processapi.MsgExecveKey - Namespaces processapi.MsgNamespaces - Capabilities processapi.MsgCapabilities - FuncId uint64 - RetProbeId uint64 - ActionId uint64 - ActionArgId uint32 - Tid uint32 // The recorded TID that triggered the event - StackID int64 + Common processapi.MsgCommon + ProcessKey processapi.MsgExecveKey + Namespaces processapi.MsgNamespaces + Capabilities processapi.MsgCapabilities + FuncId uint64 + RetProbeId uint64 + ActionId uint64 + ActionArgId uint32 + Tid uint32 // The recorded TID that triggered the event + KernelStackID int64 + UserStackID int64 } type MsgGenericKprobeArgPath struct { diff --git a/pkg/api/tracingapi/client_tracepoint.go b/pkg/api/tracingapi/client_tracepoint.go index b35af3919d2..95875eebe2b 100644 --- a/pkg/api/tracingapi/client_tracepoint.go +++ b/pkg/api/tracingapi/client_tracepoint.go @@ -8,14 +8,15 @@ import "github.com/cilium/tetragon/pkg/api/processapi" type MsgGenericTracepointArg interface{} type MsgGenericTracepoint struct { - Common processapi.MsgCommon - ProcessKey processapi.MsgExecveKey - Namespaces processapi.MsgNamespaces - Capabilities processapi.MsgCapabilities - FuncId int64 - RetProbeId uint64 - ActionId uint64 - ActionArgId uint32 - Tid uint32 // The recorded TID that triggered the event - StackID int64 + Common processapi.MsgCommon + ProcessKey processapi.MsgExecveKey + Namespaces processapi.MsgNamespaces + Capabilities processapi.MsgCapabilities + FuncId int64 + RetProbeId uint64 + ActionId uint64 + ActionArgId uint32 + Tid uint32 // The recorded TID that triggered the event + KernelStackID int64 + UserStackID int64 } diff --git a/pkg/encoder/encoder.go b/pkg/encoder/encoder.go index 31336ab7a18..a2663d69646 100644 --- a/pkg/encoder/encoder.go +++ b/pkg/encoder/encoder.go @@ -201,14 +201,25 @@ func PrintNS(ns int32) string { func HumanStackTrace(response *tetragon.GetEventsResponse, colorer *Colorer) string { out := new(strings.Builder) if ev, ok := response.Event.(*tetragon.GetEventsResponse_ProcessKprobe); ok { - if ev.ProcessKprobe.StackTrace != nil { - for _, st := range ev.ProcessKprobe.StackTrace { + if ev.ProcessKprobe.KernelStackTrace != nil { + fmt.Fprintf(out, "Kernel:\n") + for _, st := range ev.ProcessKprobe.KernelStackTrace { colorer.Green.Fprintf(out, " 0x%x:", st.Address) colorer.Blue.Fprintf(out, " %s", st.Symbol) fmt.Fprintf(out, "+") colorer.Yellow.Fprintf(out, "0x%x\n", st.Offset) } } + if ev.ProcessKprobe.UserStackTrace != nil { + fmt.Fprintf(out, "User:\n") + for _, st := range ev.ProcessKprobe.UserStackTrace { + colorer.Green.Fprintf(out, " 0x%x:", st.Address) + if st.Symbol != "" { + colorer.Blue.Fprintf(out, " %s", st.Symbol) + } + colorer.Yellow.Fprintf(out, " (%s+0x%x)\n", st.Module, st.Offset) + } + } } return out.String() } diff --git a/pkg/grpc/tracing/tracing.go b/pkg/grpc/tracing/tracing.go index dbba9e2adfe..8ac19a2f7f5 100644 --- a/pkg/grpc/tracing/tracing.go +++ b/pkg/grpc/tracing/tracing.go @@ -19,6 +19,7 @@ import ( "github.com/cilium/tetragon/pkg/logger" "github.com/cilium/tetragon/pkg/option" "github.com/cilium/tetragon/pkg/process" + "github.com/cilium/tetragon/pkg/procsyms" "github.com/cilium/tetragon/pkg/reader/bpf" "github.com/cilium/tetragon/pkg/reader/caps" "github.com/cilium/tetragon/pkg/reader/network" @@ -301,8 +302,8 @@ func GetProcessKprobe(event *MsgGenericKprobeUnix) *tetragon.ProcessKprobe { } } - var stackTrace []*tetragon.StackTraceEntry - for _, addr := range event.StackTrace { + var kernelStackTrace []*tetragon.StackTraceEntry + for _, addr := range event.KernelStackTrace { if addr == 0 { // the stack trace from the MsgGenericKprobeUnix is a fixed size // array, [unix.PERF_MAX_STACK_DEPTH]uint64, used for binary decode, @@ -325,24 +326,46 @@ func GetProcessKprobe(event *MsgGenericKprobeUnix) *tetragon.ProcessKprobe { Offset: fnOffset.Offset, Symbol: fnOffset.SymName, } - if option.Config.ExposeKernelAddresses { + if option.Config.ExposeAddresses { entry.Address = addr } - stackTrace = append(stackTrace, entry) + kernelStackTrace = append(kernelStackTrace, entry) + } + + var userStackTrace []*tetragon.StackTraceEntry + for _, addr := range event.UserStackTrace { + if addr == 0 { + continue + } + // TODO extract symbols from procfs + entry := &tetragon.StackTraceEntry{} + fsym, err := procsyms.GetFnSymbol(int(event.Msg.Tid), addr) + if err != nil { + logger.GetLogger().WithField("address", fmt.Sprintf("0x%x", addr)).Debug("stacktrace: failed to retrieve symbol, offset and module") + continue + } + entry.Offset = fsym.Offset + entry.Module = fsym.Module + entry.Symbol = fsym.Name + if option.Config.ExposeAddresses { + entry.Address = addr + } + userStackTrace = append(userStackTrace, entry) } tetragonEvent := &tetragon.ProcessKprobe{ - Process: tetragonProcess, - Parent: tetragonParent, - FunctionName: event.FuncName, - Args: tetragonArgs, - Return: tetragonReturnArg, - Action: kprobeAction(event.Msg.ActionId), - ReturnAction: kprobeAction(event.ReturnAction), - StackTrace: stackTrace, - PolicyName: event.PolicyName, - Message: event.Message, - Tags: event.Tags, + Process: tetragonProcess, + Parent: tetragonParent, + FunctionName: event.FuncName, + Args: tetragonArgs, + Return: tetragonReturnArg, + Action: kprobeAction(event.Msg.ActionId), + ReturnAction: kprobeAction(event.ReturnAction), + KernelStackTrace: kernelStackTrace, + UserStackTrace: userStackTrace, + PolicyName: event.PolicyName, + Message: event.Message, + Tags: event.Tags, } if tetragonProcess.Pid == nil { @@ -553,14 +576,15 @@ func (msg *MsgGenericTracepointUnix) PolicyInfo() tracingpolicy.PolicyInfo { } type MsgGenericKprobeUnix struct { - Msg *tracingapi.MsgGenericKprobe - ReturnAction uint64 - FuncName string - Args []tracingapi.MsgGenericKprobeArg - PolicyName string - Message string - StackTrace [unix.PERF_MAX_STACK_DEPTH]uint64 - Tags []string + Msg *tracingapi.MsgGenericKprobe + ReturnAction uint64 + FuncName string + Args []tracingapi.MsgGenericKprobeArg + PolicyName string + Message string + KernelStackTrace [unix.PERF_MAX_STACK_DEPTH]uint64 + UserStackTrace [unix.PERF_MAX_STACK_DEPTH]uint64 + Tags []string } func (msg *MsgGenericKprobeUnix) Notify() bool { diff --git a/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpolicies.yaml b/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpolicies.yaml index d08853ebb3d..9be2a37af62 100644 --- a/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpolicies.yaml +++ b/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpolicies.yaml @@ -300,6 +300,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -318,9 +322,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -608,6 +612,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -626,9 +634,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -963,6 +971,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -981,9 +993,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1271,6 +1283,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1289,9 +1305,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1527,6 +1543,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1545,9 +1565,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1835,6 +1855,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1853,9 +1877,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action diff --git a/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpoliciesnamespaced.yaml b/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpoliciesnamespaced.yaml index 5bdace97743..7914ffc0a34 100644 --- a/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpoliciesnamespaced.yaml +++ b/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpoliciesnamespaced.yaml @@ -300,6 +300,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -318,9 +322,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -608,6 +612,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -626,9 +634,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -963,6 +971,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -981,9 +993,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1271,6 +1283,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1289,9 +1305,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1527,6 +1543,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1545,9 +1565,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1835,6 +1855,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1853,9 +1877,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action diff --git a/pkg/k8s/apis/cilium.io/v1alpha1/types.go b/pkg/k8s/apis/cilium.io/v1alpha1/types.go index 0ef6a5283c9..e491c37df3e 100644 --- a/pkg/k8s/apis/cilium.io/v1alpha1/types.go +++ b/pkg/k8s/apis/cilium.io/v1alpha1/types.go @@ -234,8 +234,11 @@ type ActionSelector struct { // Only valid with the post action and with a rateLimit specified. RateLimitScope string `json:"rateLimitScope"` // +kubebuilder:validation:Optional - // Enable stack trace export. Only valid with the post action. - StackTrace bool `json:"stackTrace"` + // Enable kernel stack trace export. Only valid with the post action. + KernelStackTrace bool `json:"kernelStackTrace"` + // +kubebuilder:validation:Optional + // Enable user stack trace export. Only valid with the post action. + UserStackTrace bool `json:"userStackTrace"` } type TracepointSpec struct { diff --git a/pkg/k8s/apis/cilium.io/v1alpha1/version.go b/pkg/k8s/apis/cilium.io/v1alpha1/version.go index d4655606d64..dc8b58a087f 100644 --- a/pkg/k8s/apis/cilium.io/v1alpha1/version.go +++ b/pkg/k8s/apis/cilium.io/v1alpha1/version.go @@ -7,4 +7,4 @@ package v1alpha1 // Used to determine if CRD needs to be updated in cluster // // Developers: Bump patch for each change in the CRD schema. -const CustomResourceDefinitionSchemaVersion = "1.1.9" +const CustomResourceDefinitionSchemaVersion = "1.1.10" diff --git a/pkg/metrics/policystatemetrics/policystatemetrics.go b/pkg/metrics/policystatemetrics/policystatemetrics.go index 9feca0d2ae9..6bf2ef4107f 100644 --- a/pkg/metrics/policystatemetrics/policystatemetrics.go +++ b/pkg/metrics/policystatemetrics/policystatemetrics.go @@ -6,22 +6,21 @@ package policystatemetrics import ( "context" "strings" + "time" "github.com/cilium/tetragon/api/v1/tetragon" "github.com/cilium/tetragon/pkg/logger" "github.com/cilium/tetragon/pkg/metrics/consts" "github.com/cilium/tetragon/pkg/observer" - "github.com/cilium/tetragon/pkg/sensors" "github.com/prometheus/client_golang/prometheus" ) type policyStateCollector struct { - descriptor *prometheus.Desc - sensorManager *sensors.Manager + descriptor *prometheus.Desc } func InitMetrics(registry *prometheus.Registry) { - registry.MustRegister(newPolicyStateCollector(observer.GetSensorManager())) + registry.MustRegister(newPolicyStateCollector()) } func InitMetricsForDocs(registry *prometheus.Registry) { @@ -30,14 +29,13 @@ func InitMetricsForDocs(registry *prometheus.Registry) { // This metric collector converts the output of ListTracingPolicies into a few // gauges metrics on collection. Thus, it needs a sensor manager to query. -func newPolicyStateCollector(sensorManager *sensors.Manager) *policyStateCollector { +func newPolicyStateCollector() *policyStateCollector { return &policyStateCollector{ descriptor: prometheus.NewDesc( prometheus.BuildFQName(consts.MetricsNamespace, "", "tracingpolicy_loaded"), "The number of loaded tracing policy by state.", []string{"state"}, nil, ), - sensorManager: sensorManager, } } @@ -46,11 +44,16 @@ func (c *policyStateCollector) Describe(ch chan<- *prometheus.Desc) { } func (c *policyStateCollector) Collect(ch chan<- prometheus.Metric) { - if c.sensorManager == nil { + + sm := observer.GetSensorManager() + if sm == nil { logger.GetLogger().Debug("failed retrieving the sensor manager: manager is nil") return } - list, err := c.sensorManager.ListTracingPolicies(context.Background()) + + ctx, cancel := context.WithTimeout(context.TODO(), 900*time.Millisecond) + defer cancel() + list, err := sm.ListTracingPolicies(ctx) if err != nil { logger.GetLogger().WithError(err).Warn("error listing tracing policies to collect policies state") return @@ -97,7 +100,7 @@ type policyStateZeroCollector struct { func newPolicyStateZeroCollector() prometheus.Collector { return &policyStateZeroCollector{ - policyStateCollector: *newPolicyStateCollector(nil), + policyStateCollector: *newPolicyStateCollector(), } } diff --git a/pkg/metrics/policystatemetrics/policystatemetrics_test.go b/pkg/metrics/policystatemetrics/policystatemetrics_test.go index 0673297f029..227306b654f 100644 --- a/pkg/metrics/policystatemetrics/policystatemetrics_test.go +++ b/pkg/metrics/policystatemetrics/policystatemetrics_test.go @@ -10,6 +10,7 @@ import ( "strings" "testing" + "github.com/cilium/tetragon/pkg/observer" tus "github.com/cilium/tetragon/pkg/testutils/sensors" "github.com/cilium/tetragon/pkg/tracingpolicy" "github.com/prometheus/client_golang/prometheus" @@ -30,9 +31,16 @@ tetragon_tracingpolicy_loaded{state="load_error"} %d } reg := prometheus.NewRegistry() + + // NB(kkourt): the policy state collector uses observer.GetSensorManager() to get the sensor + // manager because in the observer tests we only initialize metrics while the observer + // changes for every test (see: + // https://github.com/cilium/tetragon/blob/22eb995b19207ac0ced2dd83950ec8e8aedd122d/pkg/observer/observertesthelper/observer_test_helper.go#L272-L276) manager := tus.GetTestSensorManager(context.TODO(), t).Manager + observer.SetSensorManager(manager) + t.Cleanup(observer.ResetSensorManager) - collector := newPolicyStateCollector(manager) + collector := newPolicyStateCollector() reg.Register(collector) err := manager.AddTracingPolicy(context.TODO(), &tracingpolicy.GenericTracingPolicy{ diff --git a/pkg/option/config.go b/pkg/option/config.go index bd0dec4894f..1456f1374c5 100644 --- a/pkg/option/config.go +++ b/pkg/option/config.go @@ -85,7 +85,7 @@ type config struct { EnablePodInfo bool EnableTracingPolicyCRD bool - ExposeKernelAddresses bool + ExposeAddresses bool } var ( diff --git a/pkg/option/flags.go b/pkg/option/flags.go index be14626449d..3a16556db1c 100644 --- a/pkg/option/flags.go +++ b/pkg/option/flags.go @@ -91,7 +91,7 @@ const ( KeyEnablePodInfo = "enable-pod-info" KeyEnableTracingPolicyCRD = "enable-tracing-policy-crd" - KeyExposeKernelAddresses = "expose-kernel-addresses" + KeyExposeStackAddresses = "expose-stack-addresses" KeyGenerateDocs = "generate-docs" ) @@ -172,7 +172,7 @@ func ReadAndSetFlags() error { Config.TracingPolicy = viper.GetString(KeyTracingPolicy) - Config.ExposeKernelAddresses = viper.GetBool(KeyExposeKernelAddresses) + Config.ExposeAddresses = viper.GetBool(KeyExposeStackAddresses) return nil } @@ -280,7 +280,7 @@ func AddFlags(flags *pflag.FlagSet) { flags.Bool(KeyEnablePodInfo, false, "Enable PodInfo custom resource") flags.Bool(KeyEnableTracingPolicyCRD, true, "Enable TracingPolicy and TracingPolicyNamespaced custom resources") - flags.Bool(KeyExposeKernelAddresses, false, "Expose real kernel addresses in events stack traces") + flags.Bool(KeyExposeStackAddresses, false, "Expose real linear addresses in events stack traces") flags.Bool(KeyGenerateDocs, false, "Generate documentation in YAML format to stdout") } diff --git a/pkg/procsyms/procsyms.go b/pkg/procsyms/procsyms.go new file mode 100644 index 00000000000..c1cd68eee55 --- /dev/null +++ b/pkg/procsyms/procsyms.go @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Authors of Tetragon + +package procsyms + +import ( + "debug/elf" + "fmt" + "sync" + + "github.com/cilium/tetragon/pkg/logger" + lru "github.com/hashicorp/golang-lru/v2" + "github.com/prometheus/procfs" +) + +var ( + cache *lru.Cache[struct { + module string + offset uint64 + }, string] + setCache sync.Once +) + +// FnSym is a function location (function name, module path + offset) +type FnSym struct { + Name string + Module string + Offset uint64 +} + +// ToString returns a string representation of FnSym +func (fsym *FnSym) ToString() string { + return fmt.Sprintf("%s (%s+0x%x)", fsym.Name, fsym.Module, fsym.Offset) +} + +// GetFnSymbol -- returns the FnSym for a given address and PID +func GetFnSymbol(pid int, addr uint64) (*FnSym, error) { + // TODO: Think about cache [pid+addr] -> [module+offset] + p, err := procfs.NewProc(pid) + if err != nil { + return nil, fmt.Errorf("Can't open /proc/%d", pid) + } + maps, err := p.ProcMaps() + if err != nil { + return nil, fmt.Errorf("Can't get proc/%d/maps", pid) + } + + if len(maps) == 0 { + return nil, fmt.Errorf("proc/%d/maps is empty", pid) + } + + // binary search + l, r := 0, len(maps)-1 + + for l < r { + // prevents overflow + m := l + ((r - l + 1) >> 1) + if uint64(maps[m].StartAddr) < addr { + l = m + } else { + r = m - 1 + } + } + + entry := maps[l] + sym := FnSym{} + sym.Module = entry.Pathname + sym.Offset = addr - uint64(entry.StartAddr) + uint64(entry.Offset) + + // Initialize symbol cache + setCache.Do(func() { + c, err := lru.New[struct { + module string + offset uint64 + }, string](1024) + if err == nil { + cache = c + } else { + logger.GetLogger().Infof("failed to initialize cache: %s", err) + } + + }) + + if cache != nil { + // cache hit + key := struct { + module string + offset uint64 + }{ + module: sym.Module, + offset: sym.Offset, + } + if ret, ok := cache.Get(key); ok { + sym.Name = ret + return &sym, nil + } + } + + if binary, err := elf.Open(entry.Pathname); err == nil { + defer binary.Close() + syms, _ := binary.Symbols() + if dsyms, err := binary.DynamicSymbols(); err == nil { + syms = append(syms, dsyms...) + } + for _, s := range syms { + if (s.Info & byte(elf.STT_FUNC)) == 0 { + continue + } + // Check special section indices + if int(s.Section) < 0 || int(s.Section) >= len(binary.Sections) { + continue + } + // Calculate symbol offset + section := binary.Sections[s.Section] + symOffset := s.Value - section.Addr + section.Offset + // Symbols are unordered by Value, so using linear scan + if symOffset <= sym.Offset && sym.Offset < (symOffset+s.Size) { + sym.Name = s.Name + break + } + } + + // Store sym in cache, no matter was it found or not. + key := struct { + module string + offset uint64 + }{ + module: sym.Module, + offset: sym.Offset, + } + cache.Add(key, sym.Name) + } + return &sym, nil +} diff --git a/pkg/selectors/kernel.go b/pkg/selectors/kernel.go index 9d23d0b4115..2f6d66b79f3 100644 --- a/pkg/selectors/kernel.go +++ b/pkg/selectors/kernel.go @@ -941,11 +941,16 @@ func ParseMatchAction(k *KernelSelectorState, action *v1alpha1.ActionSelector, a case ActionTypePost: WriteSelectorUint32(&k.data, rateLimit) WriteSelectorUint32(&k.data, rateLimitScope) - stackTrace := uint32(0) - if action.StackTrace { - stackTrace = 1 + kernelStackTrace := uint32(0) + if action.KernelStackTrace { + kernelStackTrace = 1 } - WriteSelectorUint32(&k.data, stackTrace) + WriteSelectorUint32(&k.data, kernelStackTrace) + userStackTrace := uint32(0) + if action.UserStackTrace { + userStackTrace = 1 + } + WriteSelectorUint32(&k.data, userStackTrace) case ActionTypeNoPost: // no arguments case ActionTypeSigKill: diff --git a/pkg/selectors/kernel_test.go b/pkg/selectors/kernel_test.go index 73edf9182a4..f6e0aa4277b 100644 --- a/pkg/selectors/kernel_test.go +++ b/pkg/selectors/kernel_test.go @@ -485,6 +485,7 @@ func TestParseMatchAction(t *testing.T) { 0x00, 0x00, 0x00, 0x00, // DontRepeatFor = 0 0x00, 0x00, 0x00, 0x00, // DontRepeatForScope = 0 0x00, 0x00, 0x00, 0x00, // StackTrace = 0 + 0x00, 0x00, 0x00, 0x00, // UserStackTrace = 0 } if err := ParseMatchAction(k, act1, &actionArgTable); err != nil || bytes.Equal(expected1, d.e[0:d.off]) == false { t.Errorf("parseMatchAction: error %v expected %v bytes %v parsing %v\n", err, expected1, d.e[0:d.off], act1) @@ -497,8 +498,9 @@ func TestParseMatchAction(t *testing.T) { 0x00, 0x00, 0x00, 0x00, // DontRepeatFor = 0 0x00, 0x00, 0x00, 0x00, // DontRepeatForScope = 0 0x00, 0x00, 0x00, 0x00, // StackTrace = 0 + 0x00, 0x00, 0x00, 0x00, // UserStackTrace = 0 } - length := []byte{36, 0x00, 0x00, 0x00} + length := []byte{44, 0x00, 0x00, 0x00} expected := append(length, expected1[:]...) expected = append(expected, expected2[:]...) @@ -601,11 +603,11 @@ func TestInitKernelSelectors(t *testing.T) { } expected_selsize_small := []byte{ - 0x10, 0x01, 0x00, 0x00, // size = pids + args + actions + namespaces + capabilities + 4 + 0x14, 0x01, 0x00, 0x00, // size = pids + args + actions + namespaces + capabilities + 4 } expected_selsize_large := []byte{ - 0x44, 0x01, 0x00, 0x00, // size = pids + args + actions + namespaces + namespacesChanges + capabilities + capabilityChanges + 4 + 0x48, 0x01, 0x00, 0x00, // size = pids + args + actions + namespaces + namespacesChanges + capabilities + capabilityChanges + 4 } expected_filters := []byte{ @@ -723,11 +725,12 @@ func TestInitKernelSelectors(t *testing.T) { 0x02, 0x00, 0x00, 0x00, // value 2 // actions header - 32, 0x00, 0x00, 0x00, // size = (4 * sizeof(uint32) * number of actions) + args + 36, 0x00, 0x00, 0x00, // size = (5 * sizeof(uint32) * number of actions) + args 0x00, 0x00, 0x00, 0x00, // post to userspace 0x00, 0x00, 0x00, 0x00, // DontRepeatFor = 0 0x00, 0x00, 0x00, 0x00, // DontRepeatForScope = 0 0x00, 0x00, 0x00, 0x00, // StackTrace = 0 + 0x00, 0x00, 0x00, 0x00, // UserStackTrace = 0 0x01, 0x00, 0x00, 0x00, // fdinstall 0x00, 0x00, 0x00, 0x00, // arg index of fd 0x01, 0x00, 0x00, 0x00, // arg index of string filename @@ -760,11 +763,12 @@ func TestInitKernelSelectors(t *testing.T) { 0xff, 0xff, 0xff, 0xff, // map ID for strings 2049-4096 // actions header - 32, 0x00, 0x00, 0x00, // size = (4 * sizeof(uint32) * number of actions) + args + 4 + 36, 0x00, 0x00, 0x00, // size = (5 * sizeof(uint32) * number of actions) + args + 4 0x00, 0x00, 0x00, 0x00, // post to userspace 0x00, 0x00, 0x00, 0x00, // DontRepeatFor = 0 0x00, 0x00, 0x00, 0x00, // DontRepeatForScope = 0 0x00, 0x00, 0x00, 0x00, // StackTrace = 0 + 0x00, 0x00, 0x00, 0x00, // UserStackTrace = 0 0x01, 0x00, 0x00, 0x00, // fdinstall 0x00, 0x00, 0x00, 0x00, // arg index of fd 0x01, 0x00, 0x00, 0x00, // arg index of string filename @@ -945,21 +949,22 @@ func TestReturnSelectorArgIntActionFollowfd(t *testing.T) { expU32Push(1) // off: 0 number of selectors expU32Push(4) // off: 4 relative ofset of selector (4 + 4 = 8) - expU32Push(60) // off: 8 selector: length + expU32Push(64) // off: 8 selector: length expU32Push(24) // off: 12 selector: matchReturnArgs length expU32Push(0) // off: 16 selector: matchReturnArgs arg offset[0] expU32Push(0) // off: 20 selector: matchReturnArgs arg offset[1] expU32Push(0) // off: 24 selector: matchReturnArgs arg offset[2] expU32Push(0) // off: 28 selector: matchReturnArgs arg offset[3] expU32Push(0) // off: 32 selector: matchReturnArgs arg offset[4] - expU32Push(32) // off: 36 selector: matchReturnActions length + expU32Push(36) // off: 36 selector: matchReturnActions length expU32Push(0) // off: 40 selector: selectors.ActionTypePost expU32Push(0) // off: 44 selector: rateLimit expU32Push(0) // off: 44 selector: rateLimitScope expU32Push(0) // off: 48 selector: stackTrace - expU32Push(1) // off: 52 selector: selectors.ActionTypeFollowFd - expU32Push(7) // off: 56 selector: action.ArgFd - expU32Push(8) // off: 60 selector: action.ArgName + expU32Push(0) // off: 52 selector: userStackTrace + expU32Push(1) // off: 56 selector: selectors.ActionTypeFollowFd + expU32Push(7) // off: 60 selector: action.ArgFd + expU32Push(8) // off: 64 selector: action.ArgName if bytes.Equal(expected[:expectedLen], b[:expectedLen]) == false { t.Errorf("\ngot: %v\nexp: %v\n", b[:expectedLen], expected[:expectedLen]) diff --git a/pkg/sensors/manager.go b/pkg/sensors/manager.go index 84d4ce49dd0..eaf90834081 100644 --- a/pkg/sensors/manager.go +++ b/pkg/sensors/manager.go @@ -249,9 +249,15 @@ func (h *Manager) ListTracingPolicies(ctx context.Context) (*tetragon.ListTracin retChan: retc, } - h.sensorCtl <- op - err := <-retc - return op.result, err + select { + case h.sensorCtl <- op: + err := <-retc + return op.result, err + + case <-ctx.Done(): + return nil, ctx.Err() + } + } func (h *Manager) RemoveSensor(ctx context.Context, sensorName string) error { diff --git a/pkg/sensors/tracing/generickprobe.go b/pkg/sensors/tracing/generickprobe.go index 1455f7d036f..bf120e99876 100644 --- a/pkg/sensors/tracing/generickprobe.go +++ b/pkg/sensors/tracing/generickprobe.go @@ -430,8 +430,8 @@ func preValidateKprobes(name string, kprobes []v1alpha1.KProbeSpec, lists []v1al for sid, selector := range f.Selectors { for mid, matchAction := range selector.MatchActions { - if matchAction.StackTrace && matchAction.Action != "Post" { - return fmt.Errorf("stackTrace can only be used along Post action: got stackTrace enabled in kprobes[%d].selectors[%d].matchActions[%d] with action '%s'", i, sid, mid, matchAction.Action) + if (matchAction.KernelStackTrace || matchAction.UserStackTrace) && matchAction.Action != "Post" { + return fmt.Errorf("kernelStackTrace or userStackTrace can only be used along Post action: got (kernelStackTrace/userStackTrace) enabled in kprobes[%d].selectors[%d].matchActions[%d] with action '%s'", i, sid, mid, matchAction.Action) } } } @@ -1115,20 +1115,31 @@ func handleMsgGenericKprobe(m *api.MsgGenericKprobe, gk *genericKprobe, r *bytes printers = gk.argSigPrinters } - if m.Common.Flags&processapi.MSG_COMMON_FLAG_STACKTRACE != 0 { - if m.StackID < 0 { - logger.GetLogger().Warnf("failed to retrieve stacktrace: id equal to errno %d", m.StackID) - } else { + if m.Common.Flags&(processapi.MSG_COMMON_FLAG_KERNEL_STACKTRACE|processapi.MSG_COMMON_FLAG_USER_STACKTRACE) != 0 { + if m.KernelStackID < 0 { + logger.GetLogger().Warnf("failed to retrieve kernel stacktrace: id equal to errno %d", m.KernelStackID) + } + if m.UserStackID < 0 { + logger.GetLogger().Debugf("failed to retrieve user stacktrace: id equal to errno %d", m.UserStackID) + } + if gk.data.stackTraceMap.MapHandle == nil { + logger.GetLogger().WithError(err).Warn("failed to load the stacktrace map") + } + if m.KernelStackID > 0 || m.UserStackID > 0 { // remove the error part - id := uint32(m.StackID) - - if gk.data.stackTraceMap.MapHandle != nil { - err = gk.data.stackTraceMap.MapHandle.Lookup(id, &unix.StackTrace) + if m.KernelStackID > 0 { + id := uint32(m.KernelStackID) + err = gk.data.stackTraceMap.MapHandle.Lookup(id, &unix.KernelStackTrace) + if err != nil { + logger.GetLogger().WithError(err).Warn("failed to lookup the stacktrace map") + } + } + if m.UserStackID > 0 { + id := uint32(m.UserStackID) + err = gk.data.stackTraceMap.MapHandle.Lookup(id, &unix.UserStackTrace) if err != nil { logger.GetLogger().WithError(err).Warn("failed to lookup the stacktrace map") } - } else { - logger.GetLogger().WithError(err).Warn("failed to load the stacktrace map") } } } diff --git a/pkg/sensors/tracing/kprobe_test.go b/pkg/sensors/tracing/kprobe_test.go index eb6115fb276..89c286eddb5 100644 --- a/pkg/sensors/tracing/kprobe_test.go +++ b/pkg/sensors/tracing/kprobe_test.go @@ -6083,7 +6083,7 @@ spec: assert.NoError(t, err) } -func TestKprobeStackTrace(t *testing.T) { +func TestKprobeKernelStackTrace(t *testing.T) { var doneWG, readyWG sync.WaitGroup defer doneWG.Wait() @@ -6100,7 +6100,7 @@ spec: selectors: - matchActions: - action: Post - stackTrace: true` + kernelStackTrace: true` createCrdFile(t, tracingPolicy) @@ -6119,7 +6119,7 @@ spec: stackTraceChecker := ec.NewProcessKprobeChecker("stack-trace"). WithProcess(ec.NewProcessChecker().WithBinary(sm.Full(unameBin))). - WithStackTrace(ec.NewStackTraceEntryListMatcher().WithValues( + WithKernelStackTrace(ec.NewStackTraceEntryListMatcher().WithValues( ec.NewStackTraceEntryChecker().WithSymbol(sm.Suffix(("sys_newuname"))), // we could technically check for more but stack traces look // different on different archs, at least we check that the stack @@ -6142,6 +6142,73 @@ spec: err = jsonchecker.JsonTestCheck(t, checker) assert.NoError(t, err) } +func TestKprobeUserStackTrace(t *testing.T) { + var doneWG, readyWG sync.WaitGroup + defer doneWG.Wait() + + ctx, cancel := context.WithTimeout(context.Background(), tus.Conf().CmdWaitTime) + defer cancel() + testUserStacktrace := testutils.RepoRootPath("contrib/tester-progs/user-stacktrace") + tracingPolicy := `apiVersion: cilium.io/v1alpha1 +kind: TracingPolicy +metadata: + name: "test-user-stacktrace" +spec: + kprobes: + - call: "sys_getcpu" + selectors: + - matchBinaries: + - operator: "In" + values: + - "` + testUserStacktrace + `" + matchActions: + - action: Post + userStackTrace: true` + + createCrdFile(t, tracingPolicy) + + obs, err := observertesthelper.GetDefaultObserverWithFile(t, ctx, testConfigFile, tus.Conf().TetragonLib, observertesthelper.WithMyPid()) + if err != nil { + t.Fatalf("GetDefaultObserverWithFile error: %s", err) + } + observertesthelper.LoopEvents(ctx, t, &doneWG, &readyWG, obs) + readyWG.Wait() + testProgram := exec.Command(testUserStacktrace) + + if err := testProgram.Start(); err != nil { + t.Fatalf("failed to run %s: %s", testUserStacktrace, err) + } + t.Cleanup(func() { + testProgram.Process.Kill() + fmt.Println("*******Killed********") + }) + + fmt.Println("*******Test started********") + stackTraceChecker := ec.NewProcessKprobeChecker("user-stack-trace"). + WithProcess(ec.NewProcessChecker().WithBinary(sm.Full(testUserStacktrace))). + WithUserStackTrace(ec.NewStackTraceEntryListMatcher().WithValues( + ec.NewStackTraceEntryChecker().WithSymbol(sm.Suffix(("main.main"))), + // syscall user-nix /home/user/go/src/github.com/cilium/tetragon/contrib/tester-progs/user-stacktrace __x64_sys_getcpu + // User: + // 0x0: runtime/internal/syscall.Syscall6 (/home/user/go/src/github.com/cilium/tetragon/contrib/tester-progs/user-stacktrace+0x2aee) + // 0x0: syscall.Syscall (/home/user/go/src/github.com/cilium/tetragon/contrib/tester-progs/user-stacktrace+0x63346) + // 0x0: syscall.Syscall.abi0 (/home/user/go/src/github.com/cilium/tetragon/contrib/tester-progs/user-stacktrace+0x634ae) + // 0x0: main.main (/home/user/go/src/github.com/cilium/tetragon/contrib/tester-progs/user-stacktrace+0x6503e) + // 0x0: runtime.main (/home/user/go/src/github.com/cilium/tetragon/contrib/tester-progs/user-stacktrace+0x3313d) + // 0x0: runtime.goexit.abi0 (/home/user/go/src/github.com/cilium/tetragon/contrib/tester-progs/user-stacktrace+0x5e661) + )) + fmt.Println("*******StacktraceChecker********") + checker := ec.NewUnorderedEventChecker(stackTraceChecker) + fmt.Println("*******checker********") + err = jsonchecker.JsonTestCheck(t, checker) + fmt.Println("*******checked********") + + // Kill test because of endless loop in the test for stable stack trace extraction + // test_cmd.Process.Kill() + // fmt.Println("*******Killed********") + + assert.NoError(t, err) +} func TestKprobeMultiMatcArgs(t *testing.T) { if !kernels.EnableLargeProgs() { diff --git a/vendor/github.com/cilium/tetragon/api/v1/tetragon/codegen/eventchecker/eventchecker.pb.go b/vendor/github.com/cilium/tetragon/api/v1/tetragon/codegen/eventchecker/eventchecker.pb.go index 0a1e44db261..2213e2449d2 100644 --- a/vendor/github.com/cilium/tetragon/api/v1/tetragon/codegen/eventchecker/eventchecker.pb.go +++ b/vendor/github.com/cilium/tetragon/api/v1/tetragon/codegen/eventchecker/eventchecker.pb.go @@ -696,18 +696,19 @@ func (checker *ProcessExitChecker) FromProcessExit(event *tetragon.ProcessExit) // ProcessKprobeChecker implements a checker struct to check a ProcessKprobe event type ProcessKprobeChecker struct { - CheckerName string `json:"checkerName"` - Process *ProcessChecker `json:"process,omitempty"` - Parent *ProcessChecker `json:"parent,omitempty"` - FunctionName *stringmatcher.StringMatcher `json:"functionName,omitempty"` - Args *KprobeArgumentListMatcher `json:"args,omitempty"` - Return *KprobeArgumentChecker `json:"return,omitempty"` - Action *KprobeActionChecker `json:"action,omitempty"` - StackTrace *StackTraceEntryListMatcher `json:"stackTrace,omitempty"` - PolicyName *stringmatcher.StringMatcher `json:"policyName,omitempty"` - ReturnAction *KprobeActionChecker `json:"returnAction,omitempty"` - Message *stringmatcher.StringMatcher `json:"message,omitempty"` - Tags *StringListMatcher `json:"tags,omitempty"` + CheckerName string `json:"checkerName"` + Process *ProcessChecker `json:"process,omitempty"` + Parent *ProcessChecker `json:"parent,omitempty"` + FunctionName *stringmatcher.StringMatcher `json:"functionName,omitempty"` + Args *KprobeArgumentListMatcher `json:"args,omitempty"` + Return *KprobeArgumentChecker `json:"return,omitempty"` + Action *KprobeActionChecker `json:"action,omitempty"` + KernelStackTrace *StackTraceEntryListMatcher `json:"kernelStackTrace,omitempty"` + PolicyName *stringmatcher.StringMatcher `json:"policyName,omitempty"` + ReturnAction *KprobeActionChecker `json:"returnAction,omitempty"` + Message *stringmatcher.StringMatcher `json:"message,omitempty"` + Tags *StringListMatcher `json:"tags,omitempty"` + UserStackTrace *StackTraceEntryListMatcher `json:"userStackTrace,omitempty"` } // CheckEvent checks a single event and implements the EventChecker interface @@ -779,9 +780,9 @@ func (checker *ProcessKprobeChecker) Check(event *tetragon.ProcessKprobe) error return fmt.Errorf("Action check failed: %w", err) } } - if checker.StackTrace != nil { - if err := checker.StackTrace.Check(event.StackTrace); err != nil { - return fmt.Errorf("StackTrace check failed: %w", err) + if checker.KernelStackTrace != nil { + if err := checker.KernelStackTrace.Check(event.KernelStackTrace); err != nil { + return fmt.Errorf("KernelStackTrace check failed: %w", err) } } if checker.PolicyName != nil { @@ -804,6 +805,11 @@ func (checker *ProcessKprobeChecker) Check(event *tetragon.ProcessKprobe) error return fmt.Errorf("Tags check failed: %w", err) } } + if checker.UserStackTrace != nil { + if err := checker.UserStackTrace.Check(event.UserStackTrace); err != nil { + return fmt.Errorf("UserStackTrace check failed: %w", err) + } + } return nil } if err := fieldChecks(); err != nil { @@ -849,9 +855,9 @@ func (checker *ProcessKprobeChecker) WithAction(check tetragon.KprobeAction) *Pr return checker } -// WithStackTrace adds a StackTrace check to the ProcessKprobeChecker -func (checker *ProcessKprobeChecker) WithStackTrace(check *StackTraceEntryListMatcher) *ProcessKprobeChecker { - checker.StackTrace = check +// WithKernelStackTrace adds a KernelStackTrace check to the ProcessKprobeChecker +func (checker *ProcessKprobeChecker) WithKernelStackTrace(check *StackTraceEntryListMatcher) *ProcessKprobeChecker { + checker.KernelStackTrace = check return checker } @@ -880,6 +886,12 @@ func (checker *ProcessKprobeChecker) WithTags(check *StringListMatcher) *Process return checker } +// WithUserStackTrace adds a UserStackTrace check to the ProcessKprobeChecker +func (checker *ProcessKprobeChecker) WithUserStackTrace(check *StackTraceEntryListMatcher) *ProcessKprobeChecker { + checker.UserStackTrace = check + return checker +} + //FromProcessKprobe populates the ProcessKprobeChecker using data from a ProcessKprobe event func (checker *ProcessKprobeChecker) FromProcessKprobe(event *tetragon.ProcessKprobe) *ProcessKprobeChecker { if event == nil { @@ -911,7 +923,7 @@ func (checker *ProcessKprobeChecker) FromProcessKprobe(event *tetragon.ProcessKp checker.Action = NewKprobeActionChecker(event.Action) { var checks []*StackTraceEntryChecker - for _, check := range event.StackTrace { + for _, check := range event.KernelStackTrace { var convertedCheck *StackTraceEntryChecker if check != nil { convertedCheck = NewStackTraceEntryChecker().FromStackTraceEntry(check) @@ -920,7 +932,7 @@ func (checker *ProcessKprobeChecker) FromProcessKprobe(event *tetragon.ProcessKp } lm := NewStackTraceEntryListMatcher().WithOperator(listmatcher.Ordered). WithValues(checks...) - checker.StackTrace = lm + checker.KernelStackTrace = lm } checker.PolicyName = stringmatcher.Full(event.PolicyName) checker.ReturnAction = NewKprobeActionChecker(event.ReturnAction) @@ -936,6 +948,19 @@ func (checker *ProcessKprobeChecker) FromProcessKprobe(event *tetragon.ProcessKp WithValues(checks...) checker.Tags = lm } + { + var checks []*StackTraceEntryChecker + for _, check := range event.UserStackTrace { + var convertedCheck *StackTraceEntryChecker + if check != nil { + convertedCheck = NewStackTraceEntryChecker().FromStackTraceEntry(check) + } + checks = append(checks, convertedCheck) + } + lm := NewStackTraceEntryListMatcher().WithOperator(listmatcher.Ordered). + WithValues(checks...) + checker.UserStackTrace = lm + } return checker } @@ -1082,7 +1107,7 @@ func (checker *StackTraceEntryListMatcher) Check(values []*tetragon.StackTraceEn func (checker *StackTraceEntryListMatcher) orderedCheck(values []*tetragon.StackTraceEntry) error { innerCheck := func(check *StackTraceEntryChecker, value *tetragon.StackTraceEntry) error { if err := check.Check(value); err != nil { - return fmt.Errorf("StackTrace check failed: %w", err) + return fmt.Errorf("KernelStackTrace check failed: %w", err) } return nil } @@ -1114,7 +1139,7 @@ func (checker *StackTraceEntryListMatcher) unorderedCheck(values []*tetragon.Sta func (checker *StackTraceEntryListMatcher) subsetCheck(values []*tetragon.StackTraceEntry) error { innerCheck := func(check *StackTraceEntryChecker, value *tetragon.StackTraceEntry) error { if err := check.Check(value); err != nil { - return fmt.Errorf("StackTrace check failed: %w", err) + return fmt.Errorf("KernelStackTrace check failed: %w", err) } return nil } @@ -6037,6 +6062,7 @@ type StackTraceEntryChecker struct { Address *uint64 `json:"address,omitempty"` Offset *uint64 `json:"offset,omitempty"` Symbol *stringmatcher.StringMatcher `json:"symbol,omitempty"` + Module *stringmatcher.StringMatcher `json:"module,omitempty"` } // NewStackTraceEntryChecker creates a new StackTraceEntryChecker @@ -6071,6 +6097,11 @@ func (checker *StackTraceEntryChecker) Check(event *tetragon.StackTraceEntry) er return fmt.Errorf("Symbol check failed: %w", err) } } + if checker.Module != nil { + if err := checker.Module.Match(event.Module); err != nil { + return fmt.Errorf("Module check failed: %w", err) + } + } return nil } if err := fieldChecks(); err != nil { @@ -6097,6 +6128,12 @@ func (checker *StackTraceEntryChecker) WithSymbol(check *stringmatcher.StringMat return checker } +// WithModule adds a Module check to the StackTraceEntryChecker +func (checker *StackTraceEntryChecker) WithModule(check *stringmatcher.StringMatcher) *StackTraceEntryChecker { + checker.Module = check + return checker +} + //FromStackTraceEntry populates the StackTraceEntryChecker using data from a StackTraceEntry field func (checker *StackTraceEntryChecker) FromStackTraceEntry(event *tetragon.StackTraceEntry) *StackTraceEntryChecker { if event == nil { @@ -6111,6 +6148,7 @@ func (checker *StackTraceEntryChecker) FromStackTraceEntry(event *tetragon.Stack checker.Offset = &val } checker.Symbol = stringmatcher.Full(event.Symbol) + checker.Module = stringmatcher.Full(event.Module) return checker } diff --git a/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.pb.go b/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.pb.go index 9f8305e56b9..51342e67011 100644 --- a/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.pb.go +++ b/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.pb.go @@ -3047,7 +3047,7 @@ type ProcessKprobe struct { // Action performed when the kprobe matched. Action KprobeAction `protobuf:"varint,6,opt,name=action,proto3,enum=tetragon.KprobeAction" json:"action,omitempty"` // Kernel stack trace to the call. - StackTrace []*StackTraceEntry `protobuf:"bytes,7,rep,name=stack_trace,json=stackTrace,proto3" json:"stack_trace,omitempty"` + KernelStackTrace []*StackTraceEntry `protobuf:"bytes,7,rep,name=kernel_stack_trace,json=kernelStackTrace,proto3" json:"kernel_stack_trace,omitempty"` // Name of the Tracing Policy that created that kprobe. PolicyName string `protobuf:"bytes,8,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` // Action performed when the return kprobe executed. @@ -3056,6 +3056,8 @@ type ProcessKprobe struct { Message string `protobuf:"bytes,10,opt,name=message,proto3" json:"message,omitempty"` // Tags of the Tracing Policy to categorize the event. Tags []string `protobuf:"bytes,11,rep,name=tags,proto3" json:"tags,omitempty"` + // User-mode stack trace to the call. + UserStackTrace []*StackTraceEntry `protobuf:"bytes,12,rep,name=user_stack_trace,json=userStackTrace,proto3" json:"user_stack_trace,omitempty"` } func (x *ProcessKprobe) Reset() { @@ -3132,9 +3134,9 @@ func (x *ProcessKprobe) GetAction() KprobeAction { return KprobeAction_KPROBE_ACTION_UNKNOWN } -func (x *ProcessKprobe) GetStackTrace() []*StackTraceEntry { +func (x *ProcessKprobe) GetKernelStackTrace() []*StackTraceEntry { if x != nil { - return x.StackTrace + return x.KernelStackTrace } return nil } @@ -3167,6 +3169,13 @@ func (x *ProcessKprobe) GetTags() []string { return nil } +func (x *ProcessKprobe) GetUserStackTrace() []*StackTraceEntry { + if x != nil { + return x.UserStackTrace + } + return nil +} + type ProcessTracepoint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3947,12 +3956,14 @@ type StackTraceEntry struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // address is the kernel function address. + // linear address of the function in kernel or user space. Address uint64 `protobuf:"varint,1,opt,name=address,proto3" json:"address,omitempty"` // offset is the offset into the native instructions for the function. Offset uint64 `protobuf:"varint,2,opt,name=offset,proto3" json:"offset,omitempty"` // symbol is the symbol name of the function. Symbol string `protobuf:"bytes,3,opt,name=symbol,proto3" json:"symbol,omitempty"` + // module path for user space addresses. + Module string `protobuf:"bytes,4,opt,name=module,proto3" json:"module,omitempty"` } func (x *StackTraceEntry) Reset() { @@ -4008,6 +4019,13 @@ func (x *StackTraceEntry) GetSymbol() string { return "" } +func (x *StackTraceEntry) GetModule() string { + if x != nil { + return x.Module + } + return "" +} + var File_tetragon_tetragon_proto protoreflect.FileDescriptor var file_tetragon_tetragon_proto_rawDesc = []byte{ @@ -4452,7 +4470,7 @@ var file_tetragon_tetragon_proto_rawDesc = []byte{ 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x4e, 0x65, 0x74, 0x44, 0x65, 0x76, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x44, 0x65, 0x76, 0x41, 0x72, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x42, 0x05, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x22, 0xe4, 0x03, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x42, 0x05, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x22, 0xb6, 0x04, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, @@ -4470,185 +4488,192 @@ var file_tetragon_tetragon_proto_rawDesc = []byte{ 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x0b, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, - 0x62, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x22, 0xc6, 0x02, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x54, 0x72, 0x61, 0x63, 0x65, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, - 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x07, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, - 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x2c, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x12, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, + 0x67, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x10, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, + 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, + 0x73, 0x12, 0x43, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, + 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x22, 0xc6, 0x02, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x54, 0x72, 0x61, 0x63, 0x65, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x07, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, + 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, + 0x62, 0x65, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, + 0x6f, 0x62, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, + 0x90, 0x02, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x55, 0x70, 0x72, 0x6f, 0x62, + 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x2c, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, - 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x16, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, - 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, - 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x90, 0x02, - 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x55, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x12, - 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, - 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, - 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, - 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x41, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x22, 0x96, 0x01, 0x0a, 0x0c, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x5f, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, - 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x4f, 0x6b, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, - 0x2e, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x69, 0x74, 0x73, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x07, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x04, 0x54, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x04, 0x61, 0x72, 0x67, 0x30, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x31, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, - 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, 0x32, 0x12, 0x12, 0x0a, - 0x04, 0x61, 0x72, 0x67, 0x33, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, - 0x33, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1a, - 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x74, 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, - 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x56, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x74, 0x72, + 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, + 0x67, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x0c, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x5f, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x4f, 0x6b, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, + 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x69, 0x74, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x07, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x04, 0x54, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, 0x30, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x31, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x61, + 0x72, 0x67, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x72, 0x67, 0x32, 0x12, + 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x33, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, + 0x72, 0x67, 0x33, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, + 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, + 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0x6a, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x64, 0x22, 0x64, 0x0a, 0x12, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x74, - 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x6f, 0x6f, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x0f, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, - 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x72, 0x12, 0x4c, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3e, 0x0a, 0x10, - 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, 0x5b, 0x0a, 0x0f, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2a, 0x95, 0x03, 0x0a, 0x0c, 0x4b, 0x70, - 0x72, 0x6f, 0x62, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x50, - 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, - 0x16, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, - 0x4f, 0x4c, 0x4c, 0x4f, 0x57, 0x46, 0x44, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x50, 0x52, - 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x49, 0x47, 0x4b, 0x49, - 0x4c, 0x4c, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, - 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x46, 0x4f, 0x4c, 0x4c, 0x4f, 0x57, 0x46, 0x44, - 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x10, 0x05, 0x12, 0x18, - 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x43, 0x4f, 0x50, 0x59, 0x46, 0x44, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, - 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x45, 0x54, 0x55, 0x52, 0x4c, - 0x10, 0x07, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4e, 0x53, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x10, 0x08, 0x12, - 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x4e, 0x4f, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, - 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, - 0x4c, 0x10, 0x0a, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x53, 0x4f, 0x43, 0x4b, 0x10, 0x0b, - 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x55, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x53, 0x4f, 0x43, 0x4b, 0x10, 0x0c, 0x12, - 0x20, 0x0a, 0x1c, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x59, 0x45, 0x4e, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x52, 0x10, - 0x0d, 0x2a, 0x4f, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x44, 0x45, - 0x46, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x10, 0x01, 0x2a, 0x7c, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x45, 0x41, 0x4c, - 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x10, - 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, - 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, - 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x45, 0x41, 0x4c, 0x54, - 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, - 0x2a, 0x8d, 0x02, 0x0a, 0x0f, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x69, 0x74, 0x73, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x55, 0x4e, - 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x50, - 0x52, 0x4f, 0x50, 0x52, 0x49, 0x45, 0x54, 0x41, 0x52, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, - 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x46, 0x4f, 0x52, - 0x43, 0x45, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, - 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x5f, 0x55, 0x4e, 0x4c, - 0x4f, 0x41, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x13, - 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x4d, 0x4f, 0x44, - 0x55, 0x4c, 0x45, 0x10, 0x80, 0x08, 0x12, 0x1d, 0x0a, 0x18, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, - 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x54, 0x52, 0x45, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x55, - 0x4c, 0x45, 0x10, 0x80, 0x20, 0x12, 0x1a, 0x0a, 0x15, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x55, - 0x4e, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, - 0x40, 0x12, 0x24, 0x0a, 0x1e, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, - 0x4c, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x4f, 0x44, - 0x55, 0x4c, 0x45, 0x10, 0x80, 0x80, 0x02, 0x12, 0x17, 0x0a, 0x11, 0x54, 0x41, 0x49, 0x4e, 0x54, - 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x80, 0x10, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x56, 0x0a, 0x17, 0x47, 0x65, 0x74, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, + 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x6a, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x64, 0x22, 0x64, 0x0a, + 0x12, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, + 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x0f, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x72, 0x12, 0x4c, 0x0a, 0x0b, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x74, 0x65, 0x74, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3e, + 0x0a, 0x10, 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, 0x73, + 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x2a, 0x95, 0x03, 0x0a, 0x0c, 0x4b, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x16, 0x0a, 0x12, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4b, 0x50, 0x52, 0x4f, 0x42, + 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, 0x4c, 0x4c, 0x4f, 0x57, 0x46, + 0x44, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x49, 0x47, 0x4b, 0x49, 0x4c, 0x4c, 0x10, 0x03, 0x12, 0x1c, + 0x0a, 0x18, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x55, 0x4e, 0x46, 0x4f, 0x4c, 0x4c, 0x4f, 0x57, 0x46, 0x44, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, + 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4f, 0x56, + 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, + 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x46, 0x44, + 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x45, 0x54, 0x55, 0x52, 0x4c, 0x10, 0x07, 0x12, 0x1b, 0x0a, 0x17, + 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4e, + 0x53, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, + 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x50, 0x4f, 0x53, + 0x54, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x4c, 0x10, 0x0a, 0x12, 0x1b, 0x0a, + 0x17, 0x4b, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, + 0x52, 0x41, 0x43, 0x4b, 0x53, 0x4f, 0x43, 0x4b, 0x10, 0x0b, 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x50, + 0x52, 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x54, 0x52, + 0x41, 0x43, 0x4b, 0x53, 0x4f, 0x43, 0x4b, 0x10, 0x0c, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x50, 0x52, + 0x4f, 0x42, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, + 0x59, 0x45, 0x4e, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x52, 0x10, 0x0d, 0x2a, 0x4f, 0x0a, 0x10, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1c, 0x0a, 0x18, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x10, 0x00, 0x12, 0x1d, 0x0a, + 0x19, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x01, 0x2a, 0x7c, 0x0a, 0x12, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, + 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, + 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, + 0x02, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x2a, 0x8d, 0x02, 0x0a, 0x0f, 0x54, + 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x69, 0x74, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, + 0x0a, 0x0b, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, + 0x1c, 0x0a, 0x18, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x52, 0x49, 0x45, + 0x54, 0x41, 0x52, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, + 0x13, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x5f, 0x4d, 0x4f, + 0x44, 0x55, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, + 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x5f, 0x55, 0x4e, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4d, 0x4f, + 0x44, 0x55, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, + 0x53, 0x54, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x08, + 0x12, 0x1d, 0x0a, 0x18, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, + 0x5f, 0x54, 0x52, 0x45, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x20, 0x12, + 0x1a, 0x0a, 0x15, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x49, 0x47, 0x4e, 0x45, + 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x40, 0x12, 0x24, 0x0a, 0x1e, 0x54, + 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x4c, 0x49, 0x56, 0x45, + 0x5f, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x80, + 0x02, 0x12, 0x17, 0x0a, 0x11, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, + 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x80, 0x80, 0x10, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -4806,29 +4831,30 @@ var file_tetragon_tetragon_proto_depIdxs = []int32{ 31, // 81: tetragon.ProcessKprobe.args:type_name -> tetragon.KprobeArgument 31, // 82: tetragon.ProcessKprobe.return:type_name -> tetragon.KprobeArgument 0, // 83: tetragon.ProcessKprobe.action:type_name -> tetragon.KprobeAction - 44, // 84: tetragon.ProcessKprobe.stack_trace:type_name -> tetragon.StackTraceEntry + 44, // 84: tetragon.ProcessKprobe.kernel_stack_trace:type_name -> tetragon.StackTraceEntry 0, // 85: tetragon.ProcessKprobe.return_action:type_name -> tetragon.KprobeAction - 15, // 86: tetragon.ProcessTracepoint.process:type_name -> tetragon.Process - 15, // 87: tetragon.ProcessTracepoint.parent:type_name -> tetragon.Process - 31, // 88: tetragon.ProcessTracepoint.args:type_name -> tetragon.KprobeArgument - 0, // 89: tetragon.ProcessTracepoint.action:type_name -> tetragon.KprobeAction - 15, // 90: tetragon.ProcessUprobe.process:type_name -> tetragon.Process - 15, // 91: tetragon.ProcessUprobe.parent:type_name -> tetragon.Process - 31, // 92: tetragon.ProcessUprobe.args:type_name -> tetragon.KprobeArgument - 53, // 93: tetragon.KernelModule.signature_ok:type_name -> google.protobuf.BoolValue - 3, // 94: tetragon.KernelModule.tainted:type_name -> tetragon.TaintedBitsType - 1, // 95: tetragon.GetHealthStatusRequest.event_set:type_name -> tetragon.HealthStatusType - 1, // 96: tetragon.HealthStatus.event:type_name -> tetragon.HealthStatusType - 2, // 97: tetragon.HealthStatus.status:type_name -> tetragon.HealthStatusResult - 38, // 98: tetragon.GetHealthStatusResponse.health_status:type_name -> tetragon.HealthStatus - 15, // 99: tetragon.ProcessLoader.process:type_name -> tetragon.Process - 43, // 100: tetragon.RuntimeHookRequest.createContainer:type_name -> tetragon.CreateContainer - 46, // 101: tetragon.CreateContainer.annotations:type_name -> tetragon.CreateContainer.AnnotationsEntry - 102, // [102:102] is the sub-list for method output_type - 102, // [102:102] is the sub-list for method input_type - 102, // [102:102] is the sub-list for extension type_name - 102, // [102:102] is the sub-list for extension extendee - 0, // [0:102] is the sub-list for field type_name + 44, // 86: tetragon.ProcessKprobe.user_stack_trace:type_name -> tetragon.StackTraceEntry + 15, // 87: tetragon.ProcessTracepoint.process:type_name -> tetragon.Process + 15, // 88: tetragon.ProcessTracepoint.parent:type_name -> tetragon.Process + 31, // 89: tetragon.ProcessTracepoint.args:type_name -> tetragon.KprobeArgument + 0, // 90: tetragon.ProcessTracepoint.action:type_name -> tetragon.KprobeAction + 15, // 91: tetragon.ProcessUprobe.process:type_name -> tetragon.Process + 15, // 92: tetragon.ProcessUprobe.parent:type_name -> tetragon.Process + 31, // 93: tetragon.ProcessUprobe.args:type_name -> tetragon.KprobeArgument + 53, // 94: tetragon.KernelModule.signature_ok:type_name -> google.protobuf.BoolValue + 3, // 95: tetragon.KernelModule.tainted:type_name -> tetragon.TaintedBitsType + 1, // 96: tetragon.GetHealthStatusRequest.event_set:type_name -> tetragon.HealthStatusType + 1, // 97: tetragon.HealthStatus.event:type_name -> tetragon.HealthStatusType + 2, // 98: tetragon.HealthStatus.status:type_name -> tetragon.HealthStatusResult + 38, // 99: tetragon.GetHealthStatusResponse.health_status:type_name -> tetragon.HealthStatus + 15, // 100: tetragon.ProcessLoader.process:type_name -> tetragon.Process + 43, // 101: tetragon.RuntimeHookRequest.createContainer:type_name -> tetragon.CreateContainer + 46, // 102: tetragon.CreateContainer.annotations:type_name -> tetragon.CreateContainer.AnnotationsEntry + 103, // [103:103] is the sub-list for method output_type + 103, // [103:103] is the sub-list for method input_type + 103, // [103:103] is the sub-list for extension type_name + 103, // [103:103] is the sub-list for extension extendee + 0, // [0:103] is the sub-list for field type_name } func init() { file_tetragon_tetragon_proto_init() } diff --git a/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.proto b/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.proto index 88d3b95ebaa..40cea5fd940 100644 --- a/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.proto +++ b/vendor/github.com/cilium/tetragon/api/v1/tetragon/tetragon.proto @@ -463,7 +463,7 @@ message ProcessKprobe { // Action performed when the kprobe matched. KprobeAction action = 6; // Kernel stack trace to the call. - repeated StackTraceEntry stack_trace = 7; + repeated StackTraceEntry kernel_stack_trace = 7; // Name of the Tracing Policy that created that kprobe. string policy_name = 8; // Action performed when the return kprobe executed. @@ -472,6 +472,8 @@ message ProcessKprobe { string message = 10; // Tags of the Tracing Policy to categorize the event. repeated string tags = 11; + // User-mode stack trace to the call. + repeated StackTraceEntry user_stack_trace = 12; } message ProcessTracepoint { @@ -618,10 +620,12 @@ message CreateContainer { } message StackTraceEntry { - // address is the kernel function address. + // linear address of the function in kernel or user space. uint64 address = 1; // offset is the offset into the native instructions for the function. uint64 offset = 2; // symbol is the symbol name of the function. string symbol = 3; + // module path for user space addresses. + string module = 4; } diff --git a/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpolicies.yaml b/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpolicies.yaml index d08853ebb3d..9be2a37af62 100644 --- a/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpolicies.yaml +++ b/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpolicies.yaml @@ -300,6 +300,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -318,9 +322,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -608,6 +612,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -626,9 +634,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -963,6 +971,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -981,9 +993,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1271,6 +1283,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1289,9 +1305,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1527,6 +1543,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1545,9 +1565,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1835,6 +1855,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1853,9 +1877,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action diff --git a/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpoliciesnamespaced.yaml b/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpoliciesnamespaced.yaml index 5bdace97743..7914ffc0a34 100644 --- a/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpoliciesnamespaced.yaml +++ b/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/client/crds/v1alpha1/cilium.io_tracingpoliciesnamespaced.yaml @@ -300,6 +300,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -318,9 +322,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -608,6 +612,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -626,9 +634,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -963,6 +971,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -981,9 +993,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1271,6 +1283,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1289,9 +1305,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1527,6 +1543,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1545,9 +1565,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action @@ -1835,6 +1855,10 @@ spec: argUrl: description: A URL for the getUrl action type: string + kernelStackTrace: + description: Enable kernel stack trace export. Only + valid with the post action. + type: boolean rateLimit: description: A time period within which repeated messages will not be posted. Can be specified @@ -1853,9 +1877,9 @@ spec: process or thread caused the action. Only valid with the post action and with a rateLimit specified. type: string - stackTrace: - description: Enable stack trace export. Only valid - with the post action. + userStackTrace: + description: Enable user stack trace export. Only + valid with the post action. type: boolean required: - action diff --git a/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1/types.go b/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1/types.go index 0ef6a5283c9..e491c37df3e 100644 --- a/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1/types.go +++ b/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1/types.go @@ -234,8 +234,11 @@ type ActionSelector struct { // Only valid with the post action and with a rateLimit specified. RateLimitScope string `json:"rateLimitScope"` // +kubebuilder:validation:Optional - // Enable stack trace export. Only valid with the post action. - StackTrace bool `json:"stackTrace"` + // Enable kernel stack trace export. Only valid with the post action. + KernelStackTrace bool `json:"kernelStackTrace"` + // +kubebuilder:validation:Optional + // Enable user stack trace export. Only valid with the post action. + UserStackTrace bool `json:"userStackTrace"` } type TracepointSpec struct { diff --git a/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1/version.go b/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1/version.go index d4655606d64..dc8b58a087f 100644 --- a/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1/version.go +++ b/vendor/github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1/version.go @@ -7,4 +7,4 @@ package v1alpha1 // Used to determine if CRD needs to be updated in cluster // // Developers: Bump patch for each change in the CRD schema. -const CustomResourceDefinitionSchemaVersion = "1.1.9" +const CustomResourceDefinitionSchemaVersion = "1.1.10"