Skip to content

Commit

Permalink
feat(trace): add nested traces to netlink
Browse files Browse the repository at this point in the history
Signed-off-by: Boris Glimcher <Boris.Glimcher@emc.com>
  • Loading branch information
glimchb committed Oct 9, 2023
1 parent bcf0a95 commit f66de49
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 16 deletions.
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ services:
tty: true
volumes:
- ./conf/leaf1.conf:/etc/frr/frr.conf
ports:
- "16686:16686"
networks:
n1l1tos1:
ipv4_address: 10.168.1.5
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ require (
go.opentelemetry.io/otel v1.19.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0
go.opentelemetry.io/otel/sdk v1.19.0
go.opentelemetry.io/otel/trace v1.19.0
golang.org/x/tools v0.13.0
google.golang.org/grpc v1.58.2
google.golang.org/protobuf v1.31.0
Expand Down Expand Up @@ -195,7 +196,6 @@ require (
gitlab.com/bosi/decorder v0.4.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect
go.opentelemetry.io/otel/metric v1.19.0 // indirect
go.opentelemetry.io/otel/trace v1.19.0 // indirect
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
go.tmz.dev/musttag v0.7.2 // indirect
go.uber.org/atomic v1.9.0 // indirect
Expand Down
9 changes: 7 additions & 2 deletions pkg/evpn/evpn.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ import (
"fmt"
"log"

"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"

"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/proto"
Expand All @@ -35,12 +38,13 @@ type Server struct {
Vrfs map[string]*pe.Vrf
Pagination map[string]int
nLink utils.Netlink
tracer trace.Tracer
}

// NewServer creates initialized instance of EVPN server
func NewServer() *Server {
nLink := utils.NetlinkWrapper{}
return NewServerWithArgs(&nLink)
nLink := utils.NewNetlinkWrapper()
return NewServerWithArgs(nLink)
}

// NewServerWithArgs creates initialized instance of EVPN server
Expand All @@ -56,6 +60,7 @@ func NewServerWithArgs(nLink utils.Netlink) *Server {
Vrfs: make(map[string]*pe.Vrf),
Pagination: make(map[string]int),
nLink: nLink,
tracer: otel.Tracer(""),
}
}

Expand Down
63 changes: 50 additions & 13 deletions pkg/utils/netlink.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ import (
"net"

"github.com/vishvananda/netlink"

"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace"
)

// Netlink represents limited subset of functions from netlink package
Expand All @@ -30,72 +34,105 @@ type Netlink interface {

// NetlinkWrapper wrapper for netlink package
type NetlinkWrapper struct {
tracer trace.Tracer
}

// NewNetlinkWrapper creates initialized instance of NetlinkWrapper
func NewNetlinkWrapper() *NetlinkWrapper {
return &NetlinkWrapper{tracer: otel.Tracer("")}
}

// build time check that struct implements interface
var _ Netlink = (*NetlinkWrapper)(nil)

// LinkByName is a wrapper for netlink.LinkByName
func (n *NetlinkWrapper) LinkByName(_ context.Context, name string) (netlink.Link, error) {
func (n *NetlinkWrapper) LinkByName(ctx context.Context, name string) (netlink.Link, error) {
_, childSpan := n.tracer.Start(ctx, "netlink.LinkByName")
childSpan.SetAttributes(attribute.String("link.name", name))
defer childSpan.End()
return netlink.LinkByName(name)
}

// LinkModify is a wrapper for netlink.LinkModify
func (n *NetlinkWrapper) LinkModify(_ context.Context, link netlink.Link) error {
func (n *NetlinkWrapper) LinkModify(ctx context.Context, link netlink.Link) error {
_, childSpan := n.tracer.Start(ctx, "netlink.LinkModify")
defer childSpan.End()
return netlink.LinkModify(link)
}

// LinkSetHardwareAddr is a wrapper for netlink.LinkSetHardwareAddr
func (n *NetlinkWrapper) LinkSetHardwareAddr(_ context.Context, link netlink.Link, hwaddr net.HardwareAddr) error {
func (n *NetlinkWrapper) LinkSetHardwareAddr(ctx context.Context, link netlink.Link, hwaddr net.HardwareAddr) error {
_, childSpan := n.tracer.Start(ctx, "netlink.LinkSetHardwareAddr")
defer childSpan.End()
return netlink.LinkSetHardwareAddr(link, hwaddr)
}

// AddrAdd is a wrapper for netlink.AddrAdd
func (n *NetlinkWrapper) AddrAdd(_ context.Context, link netlink.Link, addr *netlink.Addr) error {
func (n *NetlinkWrapper) AddrAdd(ctx context.Context, link netlink.Link, addr *netlink.Addr) error {
_, childSpan := n.tracer.Start(ctx, "netlink.AddrAdd")
defer childSpan.End()
return netlink.AddrAdd(link, addr)
}

// AddrDel is a wrapper for netlink.AddrDel
func (n *NetlinkWrapper) AddrDel(_ context.Context, link netlink.Link, addr *netlink.Addr) error {
func (n *NetlinkWrapper) AddrDel(ctx context.Context, link netlink.Link, addr *netlink.Addr) error {
_, childSpan := n.tracer.Start(ctx, "netlink.AddrDel")
defer childSpan.End()
return netlink.AddrDel(link, addr)
}

// LinkAdd is a wrapper for netlink.LinkAdd
func (n *NetlinkWrapper) LinkAdd(_ context.Context, link netlink.Link) error {
func (n *NetlinkWrapper) LinkAdd(ctx context.Context, link netlink.Link) error {
_, childSpan := n.tracer.Start(ctx, "netlink.LinkAdd")
defer childSpan.End()
return netlink.LinkAdd(link)
}

// LinkDel is a wrapper for netlink.LinkDel
func (n *NetlinkWrapper) LinkDel(_ context.Context, link netlink.Link) error {
func (n *NetlinkWrapper) LinkDel(ctx context.Context, link netlink.Link) error {
_, childSpan := n.tracer.Start(ctx, "netlink.LinkDel")
defer childSpan.End()
return netlink.LinkDel(link)
}

// LinkSetUp is a wrapper for netlink.LinkSetUp
func (n *NetlinkWrapper) LinkSetUp(_ context.Context, link netlink.Link) error {
func (n *NetlinkWrapper) LinkSetUp(ctx context.Context, link netlink.Link) error {
_, childSpan := n.tracer.Start(ctx, "netlink.LinkSetUp")
defer childSpan.End()
return netlink.LinkSetUp(link)
}

// LinkSetDown is a wrapper for netlink.LinkSetDown
func (n *NetlinkWrapper) LinkSetDown(_ context.Context, link netlink.Link) error {
func (n *NetlinkWrapper) LinkSetDown(ctx context.Context, link netlink.Link) error {
_, childSpan := n.tracer.Start(ctx, "netlink.LinkSetDown")
defer childSpan.End()
return netlink.LinkSetDown(link)
}

// LinkSetMaster is a wrapper for netlink.LinkSetMaster
func (n *NetlinkWrapper) LinkSetMaster(_ context.Context, link, master netlink.Link) error {
func (n *NetlinkWrapper) LinkSetMaster(ctx context.Context, link, master netlink.Link) error {
_, childSpan := n.tracer.Start(ctx, "netlink.LinkSetMaster")
defer childSpan.End()
return netlink.LinkSetMaster(link, master)
}

// LinkSetNoMaster is a wrapper for netlink.LinkSetNoMaster
func (n *NetlinkWrapper) LinkSetNoMaster(_ context.Context, link netlink.Link) error {
func (n *NetlinkWrapper) LinkSetNoMaster(ctx context.Context, link netlink.Link) error {
_, childSpan := n.tracer.Start(ctx, "netlink.LinkSetNoMaster")
defer childSpan.End()
return netlink.LinkSetNoMaster(link)
}

// BridgeVlanAdd is a wrapper for netlink.BridgeVlanAdd
func (n *NetlinkWrapper) BridgeVlanAdd(_ context.Context, link netlink.Link, vid uint16, pvid, untagged, self, master bool) error {
func (n *NetlinkWrapper) BridgeVlanAdd(ctx context.Context, link netlink.Link, vid uint16, pvid, untagged, self, master bool) error {
_, childSpan := n.tracer.Start(ctx, "netlink.BridgeVlanAdd")
defer childSpan.End()
return netlink.BridgeVlanAdd(link, vid, pvid, untagged, self, master)
}

// BridgeVlanDel is a wrapper for netlink.BridgeVlanDel
func (n *NetlinkWrapper) BridgeVlanDel(_ context.Context, link netlink.Link, vid uint16, pvid, untagged, self, master bool) error {
func (n *NetlinkWrapper) BridgeVlanDel(ctx context.Context, link netlink.Link, vid uint16, pvid, untagged, self, master bool) error {
_, childSpan := n.tracer.Start(ctx, "netlink.BridgeVlanDel")
defer childSpan.End()
return netlink.BridgeVlanDel(link, vid, pvid, untagged, self, master)
}

0 comments on commit f66de49

Please sign in to comment.