Skip to content

Commit

Permalink
Use libovsdb package for collecting ovs metrics
Browse files Browse the repository at this point in the history
Signed-off-by: nithyar <nithyar@nvidia.com>
  • Loading branch information
crnithya committed Sep 6, 2024
1 parent a551930 commit 5c89cbe
Show file tree
Hide file tree
Showing 33 changed files with 8,547 additions and 254 deletions.
7 changes: 6 additions & 1 deletion go-controller/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ CONTAINER_RUNTIME=docker
endif
CONTAINER_RUNNABLE ?= $(shell $(CONTAINER_RUNTIME) -v > /dev/null 2>&1; echo $$?)
OVN_SCHEMA_VERSION ?= v24.03.1
OVS_VERSION ?= v2.17.0
ifeq ($(NOROOT),TRUE)
C_ARGS = -e NOROOT=TRUE
else
Expand Down Expand Up @@ -64,7 +65,7 @@ else
RACE=1 hack/test-go.sh
endif

modelgen: pkg/nbdb/ovn-nb.ovsschema pkg/sbdb/ovn-sb.ovsschema
modelgen: pkg/nbdb/ovn-nb.ovsschema pkg/sbdb/ovn-sb.ovsschema pkg/vswitchd/vswitch.ovsschema
hack/update-modelgen.sh

codegen:
Expand All @@ -85,6 +86,7 @@ clean:
rm -rf ${TEST_REPORT_DIR}
rm -f ./pkg/nbdb/ovn-nb.ovsschema
rm -f ./pkg/sbdb/ovn-sb.ovsschema
rm -f ./pkg/vswitchd/vswitch.ovsschema

.PHONY: lint gofmt

Expand All @@ -108,6 +110,9 @@ pkg/nbdb/ovn-nb.ovsschema:
pkg/sbdb/ovn-sb.ovsschema:
curl -sSL https://raw.githubusercontent.com/ovn-org/ovn/$(OVN_SCHEMA_VERSION)/ovn-sb.ovsschema -o $@

pkg/vswitchd/vswitch.ovsschema:
curl -sSL https://raw.githubusercontent.com/openvswitch/ovs/${OVS_VERSION}/vswitchd/vswitch.ovsschema -o $@

${TOOLS_OUTPUT_DIR}:
mkdir -p ${TOOLS_OUTPUT_DIR}

Expand Down
17 changes: 16 additions & 1 deletion go-controller/cmd/ovn-kube-util/app/ovs-exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@ import (
"net/http"
"time"

"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/metrics"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/urfave/cli/v2"
kexec "k8s.io/utils/exec"
)

var metricsScrapeInterval int

var OvsExporterCommand = cli.Command{
Name: "ovs-exporter",
Usage: "",
Expand All @@ -21,6 +24,12 @@ var OvsExporterCommand = cli.Command{
Name: "metrics-bind-address",
Usage: `The IP address and port for the metrics server to serve on (default ":9310")`,
},
&cli.IntFlag{
Name: "metrics-interval",
Usage: "The interval in seconds at which ovs metrics are collected",
Value: 30,
Destination: &metricsScrapeInterval,
},
},
Action: func(ctx *cli.Context) error {
stopChan := make(chan struct{})
Expand All @@ -33,11 +42,17 @@ var OvsExporterCommand = cli.Command{
return err
}

// start the ovsdb client for ovs metrics monitoring
ovsClient, err := libovsdb.NewOVSClient(stopChan)
if err != nil {
klog.Errorf("Error initializing ovs client: %v", err)
}

mux := http.NewServeMux()
mux.Handle("/metrics", promhttp.Handler())

// register ovs metrics that will be served off of /metrics path
metrics.RegisterStandaloneOvsMetrics(stopChan)
metrics.RegisterStandaloneOvsMetrics(ovsClient, metricsScrapeInterval, stopChan)

server := &http.Server{Addr: bindAddress, Handler: mux}
go func() {
Expand Down
9 changes: 8 additions & 1 deletion go-controller/cmd/ovnkube/ovnkube.go
Original file line number Diff line number Diff line change
Expand Up @@ -560,7 +560,14 @@ func runOvnKube(ctx context.Context, runMode *ovnkubeRunMode, ovnClientset *util
// Note: for ovnkube node mode dpu-host no metrics is required as ovs/ovn is not running on the node.
if config.OvnKubeNode.Mode != types.NodeModeDPUHost && config.Metrics.OVNMetricsBindAddress != "" {
if config.Metrics.ExportOVSMetrics {
metrics.RegisterOvsMetricsWithOvnMetrics(ctx.Done())
metricsScrapeInterval := 30
defer cancel()

ovsClient, err := libovsdb.NewOVSClient(ctx.Done())
if err != nil {
return fmt.Errorf("failed to initialize libovsdb vswitchd client: %w", err)
}
metrics.RegisterOvsMetricsWithOvnMetrics(ovsClient, metricsScrapeInterval, ctx.Done())
}
metrics.RegisterOvnMetrics(ovnClientset.KubeClient, runMode.identity, ctx.Done())
metrics.StartOVNMetricsServer(config.Metrics.OVNMetricsBindAddress,
Expand Down
1 change: 1 addition & 0 deletions go-controller/hack/update-modelgen.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ fi

go generate ./pkg/nbdb
go generate ./pkg/sbdb
go generate ./pkg/vswitchd
42 changes: 42 additions & 0 deletions go-controller/pkg/libovsdb/libovsdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/nbdb"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/sbdb"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/vswitchd"
"github.com/prometheus/client_golang/prometheus"
"gopkg.in/fsnotify/fsnotify.v1"
"gopkg.in/natefinch/lumberjack.v2"
Expand Down Expand Up @@ -226,6 +227,47 @@ func NewNBClientWithConfig(cfg config.OvnAuthConfig, promRegistry prometheus.Reg
return c, nil
}

// NewOVSClient creates a new openvswitch Database client
func NewOVSClient(stopCh <-chan struct{}) (client.Client, error) {
cfg := &config.OvnAuthConfig{
Scheme: config.OvnDBSchemeUnix,
Address: "unix:/var/run/openvswitch/db.sock",
}

return NewOVSClientWithConfig(*cfg, stopCh)
}

func NewOVSClientWithConfig(cfg config.OvnAuthConfig, stopCh <-chan struct{}) (client.Client, error) {
dbModel, err := vswitchd.FullDatabaseModel()
if err != nil {
return nil, err
}
c, err := newClient(cfg, dbModel, stopCh)
if err != nil {
return nil, err
}
ctx, cancel := context.WithTimeout(context.Background(), types.OVSDBTimeout)
go func() {
<-stopCh
cancel()
}()

_, err = c.Monitor(ctx,
c.NewMonitor(
client.WithTable(&vswitchd.OpenvSwitch{}),
client.WithTable(&vswitchd.Bridge{}),
client.WithTable(&vswitchd.Port{}),
client.WithTable(&vswitchd.Interface{}),
),
)
if err != nil {
c.Close()
return nil, err
}

return c, nil
}

func createTLSConfig(certFile, privKeyFile, caCertFile, serverName string) (*tls.Config, error) {
cert, err := tls.LoadX509KeyPair(certFile, privKeyFile)
if err != nil {
Expand Down
17 changes: 17 additions & 0 deletions go-controller/pkg/libovsdb/ops/ovs/bridge.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ovs

import (
"context"
libovsdbclient "github.com/ovn-org/libovsdb/client"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/vswitchd"
)

// ListOVSBridges looks up all bridges from the cache
func ListBridges(ovsClient libovsdbclient.Client) ([]*vswitchd.Bridge, error) {
ctx, cancel := context.WithTimeout(context.Background(), types.OVSDBTimeout)
defer cancel()
searchedBridges := []*vswitchd.Bridge{}
err := ovsClient.List(ctx, &searchedBridges)
return searchedBridges, err
}
17 changes: 17 additions & 0 deletions go-controller/pkg/libovsdb/ops/ovs/interface.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ovs

import (
"context"
libovsdbclient "github.com/ovn-org/libovsdb/client"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/vswitchd"
)

// ListOVSInterfaces looks up all ovs interfaces from the cache
func ListInterfaces(ovsClient libovsdbclient.Client) ([]*vswitchd.Interface, error) {
ctx, cancel := context.WithTimeout(context.Background(), types.OVSDBTimeout)
defer cancel()
searchedInterfaces := []*vswitchd.Interface{}
err := ovsClient.List(ctx, &searchedInterfaces)
return searchedInterfaces, err
}
25 changes: 25 additions & 0 deletions go-controller/pkg/libovsdb/ops/ovs/openvswitch.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package ovs

import (
"context"
"fmt"
libovsdbclient "github.com/ovn-org/libovsdb/client"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types"
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/vswitchd"
)

// Get OpenvSwitch table from the cache
func GetOpenvSwitchTable(ovsClient libovsdbclient.Client) (*vswitchd.OpenvSwitch, error) {
ctx, cancel := context.WithTimeout(context.Background(), types.OVSDBTimeout)
defer cancel()
openvSwitchTableList := []*vswitchd.OpenvSwitch{}
err := ovsClient.List(ctx, &openvSwitchTableList)
if err != nil {
return nil, err
}
if len(openvSwitchTableList) == 0 {
return nil, fmt.Errorf("no openvSwitch table found")
}

return openvSwitchTableList[0], err
}
Loading

0 comments on commit 5c89cbe

Please sign in to comment.