From de8076f76b82e65ca079d8c58d471c407ae35bf6 Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Sun, 7 Jan 2024 20:40:51 +0000 Subject: [PATCH] tetragon: Add kprobe stats timer Signed-off-by: Jiri Olsa --- pkg/sensors/tracing/generickprobe.go | 43 ++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/pkg/sensors/tracing/generickprobe.go b/pkg/sensors/tracing/generickprobe.go index e9ed5f0af99..fef5948fe7b 100644 --- a/pkg/sensors/tracing/generickprobe.go +++ b/pkg/sensors/tracing/generickprobe.go @@ -14,8 +14,10 @@ import ( "net/http" "path" "strings" + "time" "github.com/cilium/ebpf" + "github.com/cilium/ebpf/link" "github.com/cilium/tetragon/pkg/api/dataapi" "github.com/cilium/tetragon/pkg/api/ops" "github.com/cilium/tetragon/pkg/api/processapi" @@ -31,6 +33,7 @@ import ( "github.com/cilium/tetragon/pkg/kernels" "github.com/cilium/tetragon/pkg/logger" "github.com/cilium/tetragon/pkg/metrics/kprobemetrics" + "github.com/cilium/tetragon/pkg/metrics/probemetrics" "github.com/cilium/tetragon/pkg/observer" "github.com/cilium/tetragon/pkg/option" "github.com/cilium/tetragon/pkg/policyfilter" @@ -39,6 +42,7 @@ import ( "github.com/cilium/tetragon/pkg/sensors" "github.com/cilium/tetragon/pkg/sensors/program" "github.com/cilium/tetragon/pkg/strutils" + "github.com/cilium/tetragon/pkg/timer" lru "github.com/hashicorp/golang-lru/v2" "github.com/sirupsen/logrus" @@ -547,6 +551,34 @@ func getKprobeSymbols(symbol string, syscall bool, lists []v1alpha1.ListSpec) ([ return []string{symbol}, syscall, nil } +func getKprobeStats(policyID policyfilter.PolicyID, policyName string, progs []*program.Program) { + for _, prog := range progs { + info, err := prog.Link.Info() + if err != nil { + continue + } + + missed := uint64(0) + + switch info.Type { + case link.PerfEventType: + pevent := info.PerfEvent() + switch pevent.Type { + case link.KprobePEIType, link.KretprobePEIType: + kprobe := pevent.Kprobe() + missed = kprobe.Missed + default: + } + case link.KprobeMultiType: + kmulti := info.KprobeMulti() + missed = kmulti.Missed + default: + } + + probemetrics.Store(uint32(policyID), policyName, prog.Attach, float64(missed)) + } +} + func createGenericKprobeSensor( spec *v1alpha1.TracingPolicySpec, name string, @@ -618,10 +650,17 @@ func createGenericKprobeSensor( return nil, err } + statsTimer := timer.NewPeriodicTimer("generickprobe stats timer", + func() { getKprobeStats(policyID, policyName, progs) }, true) + return &sensors.Sensor{ Name: name, Progs: progs, Maps: maps, + PostLoadHook: func() error { + statsTimer.Start(2 * time.Second) + return nil + }, PostUnloadHook: func() error { var errs error for _, id := range ids { @@ -637,6 +676,10 @@ func createGenericKprobeSensor( gk.stackTraceMapRef = nil } } + statsTimer.Stop() + for _, prog := range progs { + probemetrics.Remove(uint32(policyID), prog.Attach) + } return errs }, DestroyHook: func() error {