Skip to content

Commit

Permalink
tetragon: Add probemetrics package
Browse files Browse the repository at this point in the history
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
  • Loading branch information
olsajiri committed Jan 22, 2024
1 parent 9a4a31d commit d3d0be5
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 0 deletions.
2 changes: 2 additions & 0 deletions pkg/metrics/metricsconfig/initmetrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/cilium/tetragon/pkg/metrics/mapmetrics"
"github.com/cilium/tetragon/pkg/metrics/opcodemetrics"
"github.com/cilium/tetragon/pkg/metrics/policyfiltermetrics"
"github.com/cilium/tetragon/pkg/metrics/probemetrics"
"github.com/cilium/tetragon/pkg/metrics/processexecmetrics"
"github.com/cilium/tetragon/pkg/metrics/ratelimitmetrics"
"github.com/cilium/tetragon/pkg/metrics/ringbufmetrics"
Expand Down Expand Up @@ -51,6 +52,7 @@ func InitAllMetrics(registry *prometheus.Registry) {
process.NewBPFCollector(),
))
registry.MustRegister(eventmetrics.NewBPFCollector())
registry.MustRegister(probemetrics.NewBPFCollector())

// register common third-party collectors
registry.MustRegister(collectors.NewGoCollector())
Expand Down
28 changes: 28 additions & 0 deletions pkg/metrics/probemetrics/collector.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of Tetragon

package probemetrics

import (
"github.com/prometheus/client_golang/prometheus"
)

// bpfCollector implements prometheus.Collector. It collects metrics directly from BPF maps.
type bpfCollector struct{}

func NewBPFCollector() prometheus.Collector {
return &bpfCollector{}
}

func (c *bpfCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- MissedProbes.Desc()
}

func (c *bpfCollector) Collect(ch chan<- prometheus.Metric) {
lock.Lock()
defer lock.Unlock()

for key, stat := range stats {
ch <- MissedProbes.MustMetric(stat.missed, stat.policy, key.attach)
}
}
55 changes: 55 additions & 0 deletions pkg/metrics/probemetrics/probemetrics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of Tetragon

package probemetrics

import (
"sync"

"github.com/cilium/tetragon/pkg/metrics"
"github.com/cilium/tetragon/pkg/metrics/consts"
"github.com/prometheus/client_golang/prometheus"
)

type Key struct {
id uint32
attach string
}

type Stat struct {
policy string
missed float64
}

var (
MissedProbes = metrics.NewBPFCounter(prometheus.NewDesc(
prometheus.BuildFQName(consts.MetricsNamespace, "", "missed_probes_total"),
"The total number of Tetragon probe missed per policy,probe.",
[]string{"policy", "attach"}, nil,
))

lock sync.Mutex
stats = make(map[Key]Stat)
)

func Store(id uint32, policy, attach string, missed float64) {
key := Key{id, attach}
if stat, found := stats[key]; found {
stat.missed = missed
stats[key] = stat
}

lock.Lock()
defer lock.Unlock()

stats[key] = Stat{
policy: policy,
missed: missed,
}
}

func Remove(id uint32, attach string) {
lock.Lock()
defer lock.Unlock()
delete(stats, Key{id, attach})
}

0 comments on commit d3d0be5

Please sign in to comment.