pkg/exporter/probe/nlconntrack/conntrackmetrics.go (89 lines of code) (raw):

package nlconntrack import ( "context" "github.com/alibaba/kubeskoop/pkg/exporter/nettop" "github.com/alibaba/kubeskoop/pkg/exporter/probe" "github.com/ti-mo/conntrack" ) var ( MetricPrefix = "conntrack" // stats of conntrack entry operation Found = "found" Invalid = "invalid" Ignore = "ignore" Insert = "insert" InsertFailed = "insertfailed" Drop = "drop" EarlyDrop = "earlydrop" Error = "error" SearchRestart = "searchrestart" Entries = "entries" MaxEntries = "maxentries" // stats of conntrack status summary conntrackMetrics = []probe.LegacyMetric{ {Name: Found, Help: "The total number of tracked connections found in the conntrack table."}, {Name: Invalid, Help: "The total number of invalid connections encountered."}, {Name: Ignore, Help: "The total number of connections that were ignored by the conntrack module."}, {Name: Insert, Help: "The total number of connections inserted into the conntrack table."}, {Name: InsertFailed, Help: "The total number of failed attempts to insert a connection into the conntrack table."}, {Name: Drop, Help: "The total number of connections dropped from the conntrack table."}, {Name: EarlyDrop, Help: "The total number of connections dropped early before they were fully established."}, {Name: Error, Help: "The total number of errors encountered while managing connections in the conntrack table."}, {Name: SearchRestart, Help: "The total number of times the search for a connection entry was restarted."}, {Name: Entries, Help: "The current number of connections tracked in the conntrack table."}, {Name: MaxEntries, Help: "The maximum number of entries allowed in the conntrack table."}, } ) func metricsProbeCreator() (probe.MetricsProbe, error) { p := &conntrackMetricsProbe{} batchMetrics := probe.NewLegacyBatchMetrics(probeName, conntrackMetrics, p.CollectOnce) return probe.NewMetricsProbe(probeName, p, batchMetrics), nil } type conntrackMetricsProbe struct { conn *conntrack.Conn } func (c *conntrackMetricsProbe) collectStats() (map[string]uint64, error) { resMap := map[string]uint64{} stat, err := c.conn.Stats() if err != nil { return resMap, err } globalstat, err := c.conn.StatsGlobal() if err != nil { return resMap, err } for _, statpercpu := range stat { resMap[Found] += uint64(statpercpu.Found) resMap[Invalid] += uint64(statpercpu.Invalid) resMap[Ignore] += uint64(statpercpu.Ignore) resMap[Insert] += uint64(statpercpu.Insert) resMap[InsertFailed] += uint64(statpercpu.InsertFailed) resMap[Drop] += uint64(statpercpu.Drop) resMap[EarlyDrop] += uint64(statpercpu.EarlyDrop) resMap[Error] += uint64(statpercpu.Error) resMap[SearchRestart] += uint64(statpercpu.SearchRestart) } resMap[Entries] = uint64(globalstat.Entries) resMap[MaxEntries] = uint64(globalstat.MaxEntries) return resMap, nil } func (c *conntrackMetricsProbe) CollectOnce() (map[string]map[uint32]uint64, error) { resMap := map[string]map[uint32]uint64{} stats, err := c.collectStats() if err != nil { return resMap, err } for _, metric := range conntrackMetrics { resMap[metric.Name] = map[uint32]uint64{uint32(nettop.InitNetns): stats[metric.Name]} } return resMap, nil } func (c *conntrackMetricsProbe) Start(_ context.Context) error { var err error c.conn, err = conntrack.Dial(nil) return err } func (c *conntrackMetricsProbe) Stop(_ context.Context) error { return c.conn.Close() } func init() { probe.MustRegisterMetricsProbe(probeName, metricsProbeCreator) }