Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,15 @@ type ovsDPCollector struct {
UpcallFlowLimitScaledMetric *prometheus.Desc
// DOCA Pipe Group
docaUniqueItemTemplatesMetric *prometheus.Desc
// DOCA Pipe Group Entries
docaPipegroupMainEntriesMetric *prometheus.Desc
docaPipegroupSamplePostmirrorEntriesMetric *prometheus.Desc
docaPipegroupSplitPostprefixEntriesMetric *prometheus.Desc
docaPipegroupPosthashEntriesMetric *prometheus.Desc
docaPipegroupPostctEntriesMetric *prometheus.Desc
docaPipegroupPostmeterEntriesMetric *prometheus.Desc
docaPipegroupCtEntriesMetric *prometheus.Desc
docaPipegroupCtnatEntriesMetric *prometheus.Desc
}

// allow tests to stub metric fetching
Expand Down Expand Up @@ -364,6 +373,39 @@ func newOvsDPCollector() *ovsDPCollector {
"Number of unique item templates created from doca-pipe-group/dump",
nil, nil,
),
// DOCA Pipe Group Entries
docaPipegroupMainEntriesMetric: prometheus.NewDesc("ovsdp_doca_pipegroup_main_entries",
"Number of entries in the main pipe group (group_id=0x00000000)",
nil, nil,
),
docaPipegroupSamplePostmirrorEntriesMetric: prometheus.NewDesc("ovsdp_doca_pipegroup_sample_postmirror_entries",
"Number of entries in the sample-post-mirror pipe group (group_id=0xf2000000)",
nil, nil,
),
docaPipegroupSplitPostprefixEntriesMetric: prometheus.NewDesc("ovsdp_doca_pipegroup_split_postprefix_entries",
"Number of entries in the split-post-prefix pipe group (group_id=0xfa000000)",
nil, nil,
),
docaPipegroupPosthashEntriesMetric: prometheus.NewDesc("ovsdp_doca_pipegroup_posthash_entries",
"Number of entries in the post-hash pipe group (group_id=0xfb000000)",
nil, nil,
),
docaPipegroupPostctEntriesMetric: prometheus.NewDesc("ovsdp_doca_pipegroup_postct_entries",
"Number of entries in the post-ct pipe group (group_id=0xfd000000)",
nil, nil,
),
docaPipegroupPostmeterEntriesMetric: prometheus.NewDesc("ovsdp_doca_pipegroup_postmeter_entries",
"Number of entries in the post-meter pipe group (group_id=0xff000000)",
nil, nil,
),
docaPipegroupCtEntriesMetric: prometheus.NewDesc("ovsdp_doca_pipegroup_ct_entries",
"Number of entries in all CT pipe groups (group_id=0xfc0xxxxx)",
nil, nil,
),
docaPipegroupCtnatEntriesMetric: prometheus.NewDesc("ovsdp_doca_pipegroup_ctnat_entries",
"Number of entries in all CT-NAT pipe groups (group_id=0xfc1xxxxx)",
nil, nil,
),
}
}

Expand Down Expand Up @@ -657,6 +699,31 @@ func (collector *ovsDPCollector) Collect(ch chan<- prometheus.Metric) {
if isValidMetric(ovsMetric.DocaUniqueItemTemplates) {
ch <- prometheus.MustNewConstMetric(collector.docaUniqueItemTemplatesMetric, prometheus.GaugeValue, float64(ovsMetric.DocaUniqueItemTemplates))
}
// DOCA Pipe Group Entries
if isValidMetric(ovsMetric.DocaPipegroupMainEntries) {
ch <- prometheus.MustNewConstMetric(collector.docaPipegroupMainEntriesMetric, prometheus.GaugeValue, float64(ovsMetric.DocaPipegroupMainEntries))
}
if isValidMetric(ovsMetric.DocaPipegroupSamplePostmirrorEntries) {
ch <- prometheus.MustNewConstMetric(collector.docaPipegroupSamplePostmirrorEntriesMetric, prometheus.GaugeValue, float64(ovsMetric.DocaPipegroupSamplePostmirrorEntries))
}
if isValidMetric(ovsMetric.DocaPipegroupSplitPostprefixEntries) {
ch <- prometheus.MustNewConstMetric(collector.docaPipegroupSplitPostprefixEntriesMetric, prometheus.GaugeValue, float64(ovsMetric.DocaPipegroupSplitPostprefixEntries))
}
if isValidMetric(ovsMetric.DocaPipegroupPosthashEntries) {
ch <- prometheus.MustNewConstMetric(collector.docaPipegroupPosthashEntriesMetric, prometheus.GaugeValue, float64(ovsMetric.DocaPipegroupPosthashEntries))
}
if isValidMetric(ovsMetric.DocaPipegroupPostctEntries) {
ch <- prometheus.MustNewConstMetric(collector.docaPipegroupPostctEntriesMetric, prometheus.GaugeValue, float64(ovsMetric.DocaPipegroupPostctEntries))
}
if isValidMetric(ovsMetric.DocaPipegroupPostmeterEntries) {
ch <- prometheus.MustNewConstMetric(collector.docaPipegroupPostmeterEntriesMetric, prometheus.GaugeValue, float64(ovsMetric.DocaPipegroupPostmeterEntries))
}
if isValidMetric(ovsMetric.DocaPipegroupCtEntries) {
ch <- prometheus.MustNewConstMetric(collector.docaPipegroupCtEntriesMetric, prometheus.GaugeValue, float64(ovsMetric.DocaPipegroupCtEntries))
}
if isValidMetric(ovsMetric.DocaPipegroupCtnatEntries) {
ch <- prometheus.MustNewConstMetric(collector.docaPipegroupCtnatEntriesMetric, prometheus.GaugeValue, float64(ovsMetric.DocaPipegroupCtnatEntries))
}

// Collect parsed metrics from ovs-appctl metrics/show
for _, mf := range ovsMetric.ParsedMetrics {
Expand Down
95 changes: 95 additions & 0 deletions metric.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,15 @@ type OvsMetric struct {
UpcallFlowLimitScaled float64
// DOCA Pipe Group
DocaUniqueItemTemplates float64
// DOCA Pipe Group Entries
DocaPipegroupMainEntries float64
DocaPipegroupSamplePostmirrorEntries float64
DocaPipegroupSplitPostprefixEntries float64
DocaPipegroupPosthashEntries float64
DocaPipegroupPostctEntries float64
DocaPipegroupPostmeterEntries float64
DocaPipegroupCtEntries float64
DocaPipegroupCtnatEntries float64
// Parsed metrics from ovs-appctl metrics/show
ParsedMetrics []*dto.MetricFamily
}
Expand Down Expand Up @@ -170,6 +179,23 @@ func getOvsMetric() (*OvsMetric, int) {
parseDocaUniqueTemplates(&ovsMetric, string(docaPipeGroupOutput))
}

// Parse DOCA pipe group entries
cmd = exec.Command("/usr/bin/ovs-appctl", "doca-pipe-group/dump")
docaPipeGroupDumpOutput, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("Error running doca-pipe-group/dump command: %v\n", err)
ovsMetric.DocaPipegroupMainEntries = -1
ovsMetric.DocaPipegroupSamplePostmirrorEntries = -1
ovsMetric.DocaPipegroupSplitPostprefixEntries = -1
ovsMetric.DocaPipegroupPosthashEntries = -1
ovsMetric.DocaPipegroupPostctEntries = -1
ovsMetric.DocaPipegroupPostmeterEntries = -1
ovsMetric.DocaPipegroupCtEntries = -1
ovsMetric.DocaPipegroupCtnatEntries = -1
} else {
parseDocaPipegroupEntries(&ovsMetric, string(docaPipeGroupDumpOutput))
}

return &ovsMetric, successCount
}

Expand All @@ -190,6 +216,75 @@ func parseDocaUniqueTemplates(metrics *OvsMetric, output string) {
metrics.DocaUniqueItemTemplates = count
}

func parseDocaPipegroupEntries(metrics *OvsMetric, output string) {
// Initialize all metrics to -1
metrics.DocaPipegroupMainEntries = -1
metrics.DocaPipegroupSamplePostmirrorEntries = -1
metrics.DocaPipegroupSplitPostprefixEntries = -1
metrics.DocaPipegroupPosthashEntries = -1
metrics.DocaPipegroupPostctEntries = -1
metrics.DocaPipegroupPostmeterEntries = -1
metrics.DocaPipegroupCtEntries = -1
metrics.DocaPipegroupCtnatEntries = -1

if strings.TrimSpace(output) == "" {
return
}

lines := strings.Split(output, "\n")

// Counters for each pipe group
var mainCount, samplePostmirrorCount, splitPostprefixCount, posthashCount float64
var postctCount, postmeterCount, ctCount, ctnatCount float64

for _, line := range lines {
// Skip empty lines or lines that don't start with esw=
if !strings.HasPrefix(line, "esw=") {
continue
}

// Extract group_id from the line
groupIDMatch := regexp.MustCompile(`group_id=(0x[0-9a-fA-F]+)`).FindStringSubmatch(line)
if len(groupIDMatch) < 2 {
continue
}

groupID := groupIDMatch[1]

// Count entries based on group_id
switch {
case groupID == "0x00000000":
mainCount++
case groupID == "0xf2000000":
samplePostmirrorCount++
case groupID == "0xfa000000":
splitPostprefixCount++
case groupID == "0xfb000000":
posthashCount++
case groupID == "0xfd000000":
postctCount++
case groupID == "0xff000000":
postmeterCount++
case strings.HasPrefix(groupID, "0xfc1"):
// CTNAT entries (0xfc10xxxx)
ctnatCount++
case strings.HasPrefix(groupID, "0xfc0"):
// CT entries (0xfc0xxxxx but not 0xfc1xxxxx)
ctCount++
}
}

// Set the metrics
metrics.DocaPipegroupMainEntries = mainCount
metrics.DocaPipegroupSamplePostmirrorEntries = samplePostmirrorCount
metrics.DocaPipegroupSplitPostprefixEntries = splitPostprefixCount
metrics.DocaPipegroupPosthashEntries = posthashCount
metrics.DocaPipegroupPostctEntries = postctCount
metrics.DocaPipegroupPostmeterEntries = postmeterCount
metrics.DocaPipegroupCtEntries = ctCount
metrics.DocaPipegroupCtnatEntries = ctnatCount
}

func parseCoverageDoca(metrics *OvsMetric, coverageStats string) {
// DOCA
ovsDocaNoMarkRegexp := regexp.MustCompile(`(?m)^[ \t]*ovs_doca_no_mark.*total:\s*(\d+)`)
Expand Down
Loading